Python程序員鮮為人知但你應該知道的16個問題
- 不要使用可變對象作為函數默認值
代碼如下:
這2個例子說明了什麽? 字典,集合,列表等等對象是不適合作為函數默認值的. 因為這個默認值實在函數建立的時候就生成了, 每次調用都是用了這個對象的”緩存”. 我在上段時間的分享python高級編程也說到了這個問題,這個是實際開發遇到的問題,好好檢查你學過的代碼, 也許只是問題沒有暴露。
可以這樣改,代碼如下:
- 生成器不保留叠代過後的結果
代碼如下:
- lambda在閉包中會保存局部變量
代碼如下:
這個問題還是上面說的python高級編程中說過具體原因. 其實就是當我賦值給my_list的時候,lambda表達式就執行了i會循環,直到 i =4,i會保留
但是可以用生成器,代碼如下:
也可以堅持用list,代碼如下:
有點不好懂是吧,在看看python的另外一個魔法,代碼如下:
一個分組的函數,看起來很不好懂,對吧? 我們來解析下這裏
代碼如下:
- 在循環中修改列表項
代碼如下:
思考一下,為什麽 – 是因為你對列表的remove,影響了它的index
代碼如下:
- IndexError – 列表取值超出了他的索引數
代碼如下:
- 重用全局變量
代碼如下:
- 拷貝可變對象
代碼如下:
- python多繼承
代碼如下:
看起來都是很簡單, 有次序的從底向上,從前向後找,找到就返回. 再看例子:
代碼如下:
這也就涉及了MRO(Method Resolution Order):
代碼如下:
MRO的算法有點小復雜,既不是深度優先,也不是廣度優先
- 列表的+和+=, append和extend
代碼如下:
- datetime也有布爾值
這是一個坑,代碼如下:
- ‘==’ 和 is 的區別
我的理解是”is”是判斷2個對象的身份, ==是判斷2個對象的值,代碼如下:
- 淺拷貝和深拷貝
我們在實際開發中都可以向對某列表的對象做修改,但是可能不希望改動原來的列表. 淺拷貝只拷貝父對象,深拷貝還會拷貝對象的內部的子對象,代碼如下:
- bool其實是int的子類
代碼如下:
- 元組是不是真的不可變?
代碼如下:
這裏有個不錯的解釋Python’s += Is Weird, Part II :
代碼如下:
- python沒有私有方法/變量? 但是可以有”偽”的
代碼如下:
- 異常處理加else
代碼如下:
以上就是我的全部分享,如果你跟我一樣都喜歡python,也在學習python的道路上奔跑,歡迎你加入python學習群:839383765 群內每天都會分享最新業內資料,企業項目案例,分享python免費課程,共同交流學習,讓學習變(編)成(程)一種習慣!
Python程序員鮮為人知但你應該知道的16個問題