標籤:

Pythonic之道——個人總結

Pythonic之道——個人總結

來自專欄 Pythonが大好き

如果說優雅也有缺點的話,那就是你需要艱巨的工作才能得到它,需要良好的教育才能欣賞它。—— Edsger Wybe Dijkstra

筆者精心整理了許多實用的Python tricks,歡迎各位Pythonistia參考。閱讀本文前有兩點要提醒大家:

  1. 請確保你的Python是最新版或者與之接近的版本
  2. 本文僅僅談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
  • 英語一定要有底子,起碼不能成為讀文檔的障礙

推薦讀物

初學者:

  1. Python tutorial
  2. full speed python
  3. 廖雪峰的Python教程

進階者:

  1. Python進階
  2. fluent python
  3. Python cookbook
  4. Hitchhikers Guide to Python

推薦閱讀:

python基礎-*args和**kwargs
用python寫一個程序,找出數組中差值為K的數共有幾對
玩轉Pandas,讓數據處理更easy系列1
python基礎-循環(while)
真正弄懂md5值是什麼

TAG:Python | Python3x |