可以但是沒必要:不合適的選擇會讓編程變得更難

全文共1554字,預計學習時長6分鐘


你練習了很久,逐漸覺得編程變得得心應手,或許會覺得“這很簡單嘛”,千萬別大意,請牢記:編程其實很難。


可以但是沒必要:不合適的選擇會讓編程變得更難

圖源:unsplash


在自己解決問題的時候,不合適的選擇會使編程問題變得更加困難,如果沒人指導你甚至都意識不到自己編程的方式是錯誤的。你或許曾為不能及時完成代碼和重構而感到內疚,幸運的是,只要你願意,糾正這些錯誤可以讓你成為一個更好的程序員。


成為一個偉大程序員的最好方法就是克服錯誤和問題,問題總會有更優解,需要你不斷挑戰自我。習慣於做某一件事情是很容易的,但是有時候需要一點改變才能真正成為一個偉大的工程師。


可以但是沒必要:不合適的選擇會讓編程變得更難

未實現(Not Implemented)


雖然“未實現”錯誤可能是本文中最不常見的錯誤之一,但我必須給大家提個醒。在Python中觸發“未實現”不會引發 “未實現”錯誤,而會引發類型(Type)錯誤。下面這個函數能夠說明這點:


<code>def implementtest(num):
if num == 5:
raise(NotImplemented)/<code>


我們試圖運行這個函數,其中“num”等於5,看看會發生什麼:


可以但是沒必要:不合適的選擇會讓編程變得更難

解決這種非正常情況需要觸發“未實現錯誤”,而不是“未實現”本身。為此,我修改了函數:


<code>def implementtest(num):
if num == 5:
raise(NotImplemented)
if num == 10:
raise(NotImplementedError('Thisis the right way!'))/<code>


運行它能夠給我們合適的結果:


可以但是沒必要:不合適的選擇會讓編程變得更難

可以但是沒必要:不合適的選擇會讓編程變得更難

全局變量


在對象主導的程序設計語言中,全局變量應該保持在最小值。但同時須注意,解釋全局變量是十分必要的,並且在某些情況下是相當正確的。


可以但是沒必要:不合適的選擇會讓編程變得更難

圖源:unsplash


數據科學就是一個很好的例子,該領域中數量有限的對象導向編程在進行中,Python的使用更傾向於功能指導,和傳統做法有些不同。


當多個函數調用並依賴相同的值時,全局變量可能會導致命名和隱私方面的問題。全局變量能避免這種情況的一個例子是類似於文件路徑的東西,特別是與Python文件一起打包的那種。即使是編寫Gtk類,或者移動圖形用戶界面構建器,也應該局部完成,而不是全局完成。


可以但是沒必要:不合適的選擇會讓編程變得更難

可變的默認值


Python中的默認參數只計算一次,在執行函數定義時進行。已知這些參數只計算一次,那麼每個入站元素都會在每次調用中使用到,這意味著變量中包含的數據在每次函數訪問時都是可變的。


<code>def add(item, items=[]):
items.append(item)/<code>


與之相反,我們應該將參數的值設置為零,並添加一個條件來修改列表,如果這個列表並不存在的話。


<code>def add(item, items=None):
if items is None:
items = []
items.append(item)/<code>


雖然這主要適用於Python用戶的統計、數據科學、機器學習用途,但根據具體情況,擁有不可變數據才是王道。


可以但是沒必要:不合適的選擇會讓編程變得更難

拷貝!


客觀上,使用拷貝比普通賦值更好。普通的賦值操作只是將新變量指向現有對象,而不是創建新對象。


<code>d = 5
h = d/<code>


可以使用Python的拷貝模塊執行兩種主要類型的拷貝,即淺拷貝和深拷貝。


它們的差異在於你希望通過函數傳遞變量的類型。當使用深度拷貝在單個字節數據變量上時,比如整數、浮點數、布爾值或字符串,淺度拷貝和深度拷貝之間的差別就很難察覺。但是,在處理列表、元組和術語時,我建議始終使用深度拷貝。


可以但是沒必要:不合適的選擇會讓編程變得更難

圖源:unsplash


淺拷貝構造一個新的複合對象,然後儘可能把原始對象中對象的引用插入其中。深度拷貝也構造一個新的複合對象,然後遞歸地將原始對象中對象的副本插入其中。根據這些定義,很容易看出為什麼要對給定的數據類型進行區分。


<code>import copy
l = [10,15,20]
h = 5
hcopy = copy.copy(h)
z = copy.deepcopy(l)/<code>


為了測試結果,我們可以簡單地檢查它們的變量id是否與一個條件語句相同:


<code>print id(h) == id(hcopy)
False/<code>


可以但是沒必要:不合適的選擇會讓編程變得更難

圖源:unsplash


變得更優秀的過程必定是不斷改進的過程,挑戰自我走出舒適區或許是痛苦的,但也一定是有益的。編程之路道阻且長,請不要放任自己野蠻生長。


可以但是沒必要:不合適的選擇會讓編程變得更難

我們一起分享AI學習與發展的乾貨


分享到:


相關文章: