改善Python程式的91個建議
阿新 • • 發佈:2018-12-09
- 理解Pythonic的概念
- 編寫Pythonic程式碼
- 理解Python與C語言的不同之處
- 在程式碼中適當添加註釋
- 適當新增空行使程式碼佈局更為優雅、合理
- 編寫函式的四個原則(原則一:函式設計儘量短小,巢狀層次不宜過深,原則二:函式申明做到合理、簡單、易於使用。原則三:函式引數設計應該考慮向下相容。原則四:一個函式只做一件事,儘量保證函式語句粒度的一致性。)
- 將常量集中到一個檔案
- 利用
assert
語句來發現問題 - 資料交換值的時候不推薦使用中間變數
- 充分利用
Lazy evaluation
的特性 - 理解列舉代替實現的缺陷
- 不推薦使用
type
來進行型別檢查 - 儘量轉換為浮點型別後在做除法
- 警惕
eval()
- 使用
enumerate()
獲取序列迭代的索引和值 - 分清
==
與is
的適用場景 - 考慮相容性,儘可能適用
Unicode
- 構建合理的包層次來管理
module
- 有節制使使用
from...import
語句 - 優先使用
absolute import
來匯入模組 i+1=1
不等於++1
- 使用
with
自動關閉資源 - 適用
else
子句簡化迴圈(異常處理) - 遵循異常處理的幾點基本原則(1.注意異常的粒度,不推薦在
try
中放入過多的程式碼。2.謹慎使用單獨的except
的語句處理所有的異常,最好能定位具體的異常。3.注意異常的捕獲的順序,在合適的層次處理異常。4.使用更加友好的異常資訊,遵循異常引數的規範) - 避免
finally
- 深入理解
None
,正確判斷物件是否為空 - 連線字串優先使用
join
而不是+
- 格式化字串是儘量使用
.format
方式而不是%
- 區別對待可變物件和不可變物件
[]
、{}
和()
:一致的容器初始化形式(使用列表解析式
([expr for iter_var in iterable if cond_expr]),元組,集合,字典也有類似的語法。)- 記住引數傳參既不是傳值也不是傳引用
- 警惕預設引數潛在的問題
- 慎用變長引數
- 深入理解
str()
和repr()
的區別 - 分清
staticmethod
和classmethod
的適用場景 - 掌握字串的基本用法
- 按需選擇
sort()
或者sorted()
- 使用
copy
- 使用
Counter
進行技術統計 - 深入掌握
ConfigParser
(配置檔案) - 使用
argparse
處理命令列引數 - 使用
pandas
處理大型CSV
檔案 - 一般情況使用
ElementTree
解析XML
- 理解模組
pickle
的優劣 - 序列化的另外一個不錯的選擇——
JSON
- 使用
traceback
獲取棧資訊 - 使用
logging
記錄日記資訊 - 使用
threading
模組編寫多執行緒程式 - 使用
Queue
是多執行緒程式設計更安全 - 利用模組實現單例模式
- 用
mixin
模式讓程式更靈活 - 用釋出訂閱模式實現耦合
- 用狀態模式美化程式碼
- 理解內建型別
buit-in objects
__init__()
不是構造方法- 理解名字查詢機制
- 為什麼需要
self
引數 - 理解
MRO
與多繼承 - 理解描述符機制
- 區別
__getattr__()
和__getattribute__()
方法 - 使用更為安全的
property
- 掌握
metaclass
- 熟悉
Python
物件協議 - 利用操作符過載實現中綴語法
- 熟悉
Python
的迭代器協議 - 熟悉
Python
的生成器 - 基於生成器的協程及
greenlet
- 理解
GIL
的侷限性 - 物件的管理與垃圾回收
- 從
pypi
安裝包 - 使用
pip
和yolk
安裝、管理包 - 做
paster
建立包 - 理解單元測試概念
- 為包編寫單元測試
- 利用測試驅動開發提高程式碼的可能性
- 使用
Pylint
檢查程式碼風格 - 進行高效的的程式碼審查
- 將包釋出到
pypi
- 瞭解程式碼優化的基本原則
- 藉助效能優化工具
- 利用
cProfile
定位效能瓶頸 - 使用
memory_profiler
和objgraph
剖析記憶體使用 - 努力降低演算法複雜度
- 掌握迴圈優化的基本技巧
- 使用生成器提高效率
- 使用不同的資料結構優化效能
- 充分利用
set
的優勢 - 使用
multiprocessing
克服GIL
的缺陷 - 使用執行緒池提高效率
- 利用
C/C++
模組擴充套件高效能 - 使用
Cython
編寫擴充套件模組