編寫高質量Python程序的91個建議

書籍信息

  • 書名:編寫高質量代碼 改善Python程序的91個建議
  • 作者:張穎、賴勇浩
  • 出版社:機械工業出版社

筆記部分

建議1:理解Pythonic概念

Pythonic可以定義爲:充分體現Python自身特色的代碼風格。
推薦閱讀:PEP 8 – Style Guide for Python Code

建議2:編寫Pythonic代碼
  1. 避免只用大小寫來區分不同的對象。
  2. 避免使用容易引起混淆的名稱如字母’O’的大小寫和字母’L’的小寫‘l’。
  3. 不要害怕過長的變量名,變量名易於理解最重要。
建議3:理解Python與C語言的不同之處
  1. “縮進"與”{ }"
    C、C++、Java等語言使用花括號{}來分隔代碼,Python則採用嚴格的縮進方式(4 spaces 或者 1 tab)注意空格和tab不能混用。
  2. 單引號(’)和雙引號(")
    C中單引號代表字符,雙引號表示字符串,而在Python中,單雙引號無明顯區別。
  3. 三元操作符(?:)
    三元操作符爲if…else的簡寫方法,語法形式爲C?X:Y,表示當C爲True取X,反之取Y。在Python中沒有三元操作符,但有等價的形式:X if C else Y。
  4. switch… case
    Python中沒有像C語言那樣的條件分支語句,但是可以使用if…elif語句來實現同樣的功能。
建議4:在代碼中適當添加註釋

Python中有三種形式的代碼註釋:塊註釋、行註釋以及文檔註釋。
使用註釋的建議有以下:

  1. 僅僅註釋那些複雜的操作、算法,還有不夠一目瞭然的代碼。
  2. 註釋和代碼隔開一定的距離,不要過於緊湊,塊註釋後最好留幾行空白。
  3. 給外部可訪問的函數和方法添加文檔註釋。
建議5:通過適當添加空行使代碼佈局更爲優雅、合理

下圖可供參考
在這裏插入圖片描述

建議6:編寫函數的4個原則
  1. 函數設計要儘量短小,嵌套層次不宜過深。
  2. 函數聲明應做到合理、簡單、易於使用(函數名易於理解、參數簡潔)。
  3. 函數參數設計應該考慮向後兼容(易於後續版本開發)。
  4. 一個函數只做一件事。儘量保證函數語句粒度的一致性。
建議7:將常量集中到一個文件

很少用到這一點,可以用過自定義類實現常量功能。

建議8:利用assert語句來發現問題

斷言(assert)在很多語言中都存在,主要爲調試程序服務,能夠快速方便檢查程序的異常或不恰當的輸入等。
要注意的是使用assert是有代價的,它會對性能產生一定的影響,可以不用盡量不用。

建議9:數據交換值的時候不推薦使用中間變量

在Python,交換兩個變量的值不需要中間變量

a = 10
b = 11

#不推薦的做法
tmp = a        
a = b
b = tmp       

#pythonic的交換方式,無需中間變量且效率更高
a, b = b, a    
建議10:充分利用Lazy evaluation的特性

Lazy evaluation可以理解爲延遲計算或惰性計算,可帶來的好處有兩個方面:

  1. 避免不必要的計算,提升效率
    對Python中的條件表達式 if x and y , 當x爲False的情況下直接返回False,程序不會計算y表達式的值。對於if x or y, 當x爲True時,也不會計算y表達式的值並直接返回True。
  2. 節省空間,使無限循環的數據結構稱爲可能
    生成器瞭解一下?Python迭代器和生成器
建議11:理解枚舉替代實現的缺陷
建議12:不推薦使用type來進行類型檢查
建議13:儘量轉換爲浮點類型後再做除法
建議14:警惕eval()的安全漏洞
建議15:使用enumerate()獲取序列迭代的索引和值
建議16:分清=與is的適用場景
建議17:考慮兼容性,儘可能使用Unicode
建議18:構建合理的包層次來管理module
建議19:有節制地使用from…import語句
建議20:優先使用absolute import來導入模塊
建議21:i+=1 不等於 ++i
建議22:使用with自動關閉資源
建議23:使用else子句簡化循環(異常處理)
建議24:遵循異常處理的幾點基本原則
建議25:避免finally中可能發生的陷阱
建議26:深人理解None,正確判斷對象是否爲空
建議27:連接字符串應優先使用join而不是+
建議28:格式化字符串時儘量使用.format方式而不是%
建議29:區別對待可變對象和不可變對象
建議30:[]、()和{}: 一致的容器初始化形式
建議31:記住函數傳參既不是傳值也不是傳引用
建議32:警惕默認參數潛在的問題
建議33:慎用變長參數
建議34:深入理解str()和repr()的區別
建議35:分清staticmethod和classmethod的適用場景
建議36:掌握字符串的基本用法
建議37:按需選擇sort()或者sorted()
建議38:使用copy模塊深拷貝對象
建議39:使用Counter進行計數統計
建議40:深入掌握ConfigParser
建議41:使用argparse處理命令行參數
建議42:使用pandas處理大型CSV文件
建議43:一般情況使用ElementTree解析XML
建議44:理解模塊pickle優劣
建議45:序列化的另一個不錯的選擇—JSON
建議46:使用traceback獲取棧信息
建議47:使用logging記錄日誌信息
建議48:使用threading模塊編寫多線程程序
建議49:使用Queue使多線程編程更安全
第5章 設計模式
建議50:利用模塊實現單例模式
建議51:用mixin模式讓程序更加靈活
建議52:用發佈訂閱模式實現鬆耦合
建議53:用狀態模式美化代碼
第6章 內部機制
建議54:理解build-in objects
建議55:init() 不是構造方法
建議56:理解名字查找機制
建議57:爲什麼需要self參數
建議58:理解MRO與多繼承
建議59:理解描述符機制
建議60:區別getattr()和getattribute()方法
建議61:使用更爲安全的property
建議62:掌握metaclass
建議63:熟悉Python對象協議
建議64:利用操作符重載實現中綴語法
建議65:熟悉Python的迭代器協議
建議66:熟悉Python的生成器
建議67:基於生成器的協程及greenlet
建議68:理解GIL的侷限性
建議69:對象的管理與垃圾回收
第7章 使用工具輔助項目開發
建議70:從PyPI安裝包
建議71:使用pip和yolk安裝、管理包
建議72:做paster創建包
建議73:理解單元測試概念
建議74:爲包編寫單元測試
建議75:利用測試驅動開發提高代碼的可測性
建議76:使用Pylint檢查代碼風格
建議77:進行高效的代碼審查
建議78:將包發佈到PyPI
第8章 性能剖析與優化
建議79:瞭解代碼優化的基本原則
建議80:藉助性能優化工具
建議81:利用cProfile定位性能瓶頸
建議82:使用memory_profiler和objgrash剖析內存使用
建議83:努力降低算法複雜度
建議84:掌握循環優化的基本技巧
建議85:使用生成器提高效率
建議86:使用不同的數據結構優化性能
建議87:充分利用set的優勢
建議88:使用meltiprocessing克服GIL的缺陷
建議89:使用線程池提高效率
建議90:使用C/C++模塊擴展提高性能
建議91:使用Cython編寫擴展模塊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章