Pythonic之道——個人總結
06-26
Pythonic之道——個人總結
來自專欄 Pythonが大好き
如果說優雅也有缺點的話,那就是你需要艱巨的工作才能得到它,需要良好的教育才能欣賞它。—— Edsger Wybe Dijkstra
筆者精心整理了許多實用的Python tricks,歡迎各位Pythonistia參考。閱讀本文前有兩點要提醒大家:
- 請確保你的Python是最新版或者與之接近的版本
- 本文僅僅談Python語言本身,標準庫請看另一篇文章
基本
- f-string: 模板字元串,f{val}
- 拼接字元串: .join(li)
- 三元運算符: 簡化if寫法,x if C else y
- pathlib用法: 一個比os.path更加人性化的路徑庫
- __main__: py程序的入口,在文件被直接運行時運行,而不會在文件被導入時運行
- __init__.py: 使Python把當前目錄當做一個package
- 執行外部系統命令: 利用os.system或subprocess.call
- in操作符: 判斷元素是否存在於另一元素中
- 延時功能:time.sleep
- 連續捕獲多個異常: except (E1, E2) as e: ...
- 獲取環境變數: os.environ.get(env_val)
- 單下劃線: 暫存結果;元組解包時忽略某變數
函數
- 生成器: 只能迭代一次的迭代器,並不會把所有的值存入內存,而是直接生成值,函數里用yield關鍵詞表示,同樣支持推導式
- 裝飾器: 給函數添加額外的功能,通常用@符號表示
- 函數有多個輸出: return一個元組就行
- 默認參數: 不能用Mutable對象作為默認參數,而應該用Immutable對象
- *args和**kwargs: 前者將參數打包成元組;後者將參數打包成字典
- lambda函數: 創建簡單的小函數,lambda params: ...
- 上下文管理器: 用於資源的加鎖和解鎖,以及關閉已打開的文件,操作多個文件時with語句可以嵌套
- 偏函數: 用於固定原函數的某些參數來生成新的函數
- 函數註解: 給函數進行類型註解,增強可讀性
- 文檔字元串: 一個好的函數必定有完備清晰的文檔
數據結構
列表
- 推導式: [elem for elem in iterable (if ... else ...)]
- slice: 切片,用來選擇元素,li[start:end:step]
- enumerate: 索引迭代,for i, elem in enumerate(seq): ...
- append和extend: 前者追加的是對象,後者追加的是可迭代物中的元素
- 淺拷貝和深拷貝: 理解Python對象的賦值其實就是對象的引用
- 連接兩個表: [*l1, *l2]
- zip: 同時迭代兩個列表, list(zip(l1, l2)) => l
- unzip: zip的逆操作, list(zip(*l)) => [l1, l2]
字典
- get: 獲取鍵值,可以處理缺失值
- 推導式: {key: value for (key, value) in iterable}
- 合併: {**x, **y}
- 鍵值排序: sorted(d, key=operator.itemgetter(key))
- 迭代: for key, value in d.items(): ...
- switch實現: 利用哈希表驅動
- 刪除key: d.pop(key)
- 兩列表生成字典: dict(zip(keys, values))
OOP
- super: 實現子類調用父類的方法, super().__init__()
- 元類: 生產類的工廠,典型的例子是ORM的實現
- 類方法和靜態方法: 前者綁定cls本身,後者啥都不綁定
- __repr__和__str__: 前者方便開發者測試,後者方便用戶閱讀
- 定製異常類: 繼承Exception這個基類就行,別忘了super().__init__(message)
- @property: 把類的方法變成屬性調用
- __slots__: 為了在動態綁定屬性時節約內存
- 猴子補丁: 在運行時替換類的方法和屬性
- iterable和iterator區別: iterable: 實現了__iter__或__getitem__協議的類,其實例為iterator; iterator: 有__next__方法的object
其他
編程技巧
- 善用IDE或vscode編輯器的代碼跳轉功能(F12鍵或者Ctrl+滑鼠左鍵),在使用一個複雜的函數前必須看其源碼
- 善用自省(尤其是dir和help函數),能使你不用去死記函數的功能(因為函數一般都會有完善的文檔)
- 推薦一個能自動補全代碼的神器:ptpython
- 善用google和stackoverflow來解決問題
- 如果出現重複的代碼,那麼它肯定能被重構
- 為了理解Python代碼的執行過程,可以用pythontutor
- 英語一定要有底子,起碼不能成為讀文檔的障礙
推薦讀物
初學者:
- Python tutorial
- full speed python
- 廖雪峰的Python教程
進階者:
- Python進階
- fluent python
- Python cookbook
- Hitchhikers Guide to Python
推薦閱讀:
※python基礎-*args和**kwargs
※用python寫一個程序,找出數組中差值為K的數共有幾對
※玩轉Pandas,讓數據處理更easy系列1
※python基礎-循環(while)
※真正弄懂md5值是什麼