你練習了好久,逐漸以爲編程變得駕輕就熟,或許會以爲「這很簡單嘛」,千萬別大意,請牢記:編程其實很難。python
圖源:unsplash程序員
在本身解決問題的時候,不合適的選擇會使編程問題變得更加困難,若是沒人指導你甚至都意識不到本身編程的方式是錯誤的。你或許曾爲不能及時完成代碼和重構而感到內疚,幸運的是,只要你願意,糾正這些錯誤可讓你成爲一個更好的程序員。編程
成爲一個偉大程序員的最好方法就是克服錯誤和問題,問題總會有更優解,須要你不斷挑戰自我。習慣於作某一件事情是很容易的,可是有時候須要一點改變才能真正成爲一個偉大的工程師。app
雖然「未實現」錯誤多是本文中最不常見的錯誤之一,但我必須給你們提個醒。在Python中觸發「未實現」不會引起 「未實現」錯誤,而會引起類型(Type)錯誤。下面這個函數可以說明這點:機器學習
def implementtest(num): if num == 5: raise(NotImplemented)
咱們試圖運行這個函數,其中「num」等於5,看看會發生什麼:ide
解決這種非正常狀況須要觸發「未實現錯誤」,而不是「未實現」自己。爲此,我修改了函數:函數
def implementtest(num): if num == 5: raise(NotImplemented) if num == 10: raise(NotImplementedError( Thisis the right way! ))
運行它可以給咱們合適的結果:學習
在對象主導的程序設計語言中,全局變量應該保持在最小值。但同時須注意,解釋全局變量是十分必要的,而且在某些狀況下是至關正確的。測試
圖源:unsplash設計
數據科學就是一個很好的例子,該領域中數量有限的對象導向編程在進行中,Python的使用更傾向於功能指導,和傳統作法有些不一樣。
當多個函數調用並依賴相同的值時,全局變量可能會致使命名和隱私方面的問題。全局變量能避免這種狀況的一個例子是相似於文件路徑的東西,特別是與Python文件一塊兒打包的那種。即便是編寫Gtk類,或者移動圖形用戶界面構建器,也應該局部完成,而不是全局完成。
Python中的默認參數只計算一次,在執行函數定義時進行。已知這些參數只計算一次,那麼每一個入站元素都會在每次調用中使用到,這意味着變量中包含的數據在每次函數訪問時都是可變的。
def add(item, items=[]): items.append(item)
與之相反,咱們應該將參數的值設置爲零,並添加一個條件來修改列表,若是這個列表並不存在的話。
def add(item, items=None): if items is None: items = [] items.append(item)
雖然這主要適用於Python用戶的統計、數據科學、機器學習用途,但根據具體狀況,擁有不可變數據纔是王道。
客觀上,使用拷貝比普通賦值更好。普通的賦值操做只是將新變量指向現有對象,而不是建立新對象。
d = 5 h = d
可使用Python的拷貝模塊執行兩種主要類型的拷貝,即淺拷貝和深拷貝。
它們的差別在於你但願經過函數傳遞變量的類型。當使用深度拷貝在單個字節數據變量上時,好比整數、浮點數、布爾值或字符串,淺度拷貝和深度拷貝之間的差異就很難察覺。可是,在處理列表、元組和術語時,我建議始終使用深度拷貝。
圖源:unsplash
淺拷貝構造一個新的複合對象,而後儘量把原始對象中對象的引用插入其中。深度拷貝也構造一個新的複合對象,而後遞歸地將原始對象中對象的副本插入其中。根據這些定義,很容易看出爲何要對給定的數據類型進行區分。
import copy l = [10,15,20] h = 5 hcopy = copy.copy(h) z = copy.deepcopy(l)
爲了測試結果,咱們能夠簡單地檢查它們的變量id是否與一個條件語句相同:
print id(h) == id(hcopy) False
圖源:unsplash
變得更優秀的過程一定是不斷改進的過程,挑戰自我走出溫馨區或許是痛苦的,但也必定是有益的。編程之路道阻且長,請不要聽任本身野蠻生長。
編譯組:劉鑑楠、王品一 相關連接: https://towardsdatascience.com/avoid-these-rookie-python-mistakes-9cc17cccd051 如轉載,請後臺留言,遵照轉載規範
ACL2018論文集50篇解讀 EMNLP2017論文集28篇論文解讀 2018年AI三大頂會中國學術成果全連接 ACL2017論文集:34篇解讀乾貨全在這裏 10篇AAAI2017經典論文回顧