原書筆記。
用Pythonic方式來思考
確認(rèn)自己所用的Python版本
Python 2
的功能開發(fā)已經(jīng)凍結(jié)挠乳,只會進(jìn)行bug修復(fù)、安全增強(qiáng)以及移植等工作姑躲∷铮可以使用2to3
和six
等工具從Python 2
遷移到Python 3
。
遵循PEP 8風(fēng)格指南
Python Enhancement Proposal #8簡稱PEP 8
黍析。主要包括以下一些要點(diǎn)卖怜。
-
空白
-使用
space
進(jìn)行縮進(jìn),而非tab
阐枣,每個語法相關(guān)縮進(jìn)使用4個space
每行字符數(shù)不超過79
多行的長表達(dá)式马靠,應(yīng)該在首行以后再加一層縮進(jìn)
函數(shù)間隔兩行奄抽,類中方法間隔一行
不需要前后置
space
的情形:下標(biāo)獲取元素、調(diào)用函數(shù)甩鳄、關(guān)鍵字賦值等變量賦值的等號兩側(cè)各置一個
space
-
命名
函數(shù)逞度、變量及屬性使用小寫字母,單詞間以
_
相連受保護(hù)的實(shí)例屬性以
_
開頭娩贷,私有的實(shí)例屬性以__
開頭類與異常使用CamelNaming
模塊級別的常量用全大寫第晰,單詞間以
_
相連類的實(shí)例方法首個參數(shù)為
self
,類方法的首個參數(shù)為cls
-
表達(dá)式和語句
否定詞內(nèi)聯(lián)而非前置
不要用長度對容器做零檢查彬祖,空值會自動評估為
False
,非空值為True
不寫單行的
if
品抽、for
储笑、while
以及except
語句import
語句在腳本最前,使用絕對名稱引入模塊圆恤,不可避免的相對引用應(yīng)寫作from . import foo
import
語句分為三個部分:標(biāo)準(zhǔn)庫模塊突倍、第三方模塊和自用模塊,各部分內(nèi)按模塊的字母順序排列
了解bytes盆昙、str與unicode的
Python 2 |
Python 3 |
|
---|---|---|
字符串原始8位值 | str |
bytes |
Unicode字符 | unicode |
str |
在寫Python程序時羽历,應(yīng)該把編碼和解碼放在最外圍,核心部分應(yīng)該使用Unicode字符類型淡喜。
打開文件進(jìn)行操作時秕磷,Python 2
的默認(rèn)編碼格式為二進(jìn)制,而Python 3
則默認(rèn)為UTF-8格式(open
函數(shù)的encoding
參數(shù)默認(rèn)值為'utf-8'
)炼团∨煜可以在open
函數(shù)的參數(shù)中用'b'
制定二進(jìn)制格式.
用輔助函數(shù)來取代復(fù)雜的表達(dá)式
不要一味追求過于緊湊的寫法,會寫出非常復(fù)雜的表達(dá)式瘟芝。
了解切割序列的辦法
在單詞切片操作內(nèi)易桃,不要同時制定start、end和stride
用列表推導(dǎo)來取代map和filter
對于簡單情形锌俱,list comprehension要比map
和filter
更加清晰晤郑。
不要使用含有兩個以上表達(dá)式的列表推斷
超過兩個表達(dá)式的list comprehension較難理解,應(yīng)避免贸宏。
用生成器表達(dá)式來改寫數(shù)據(jù)量較大的列表推導(dǎo)
Generator expression是對list comprehension和generator的一種泛化造寝,在運(yùn)行時,不會把整個輸出序列呈現(xiàn)出來锚赤,而是會估值為iterator匹舞。最簡單的generator expression可以用括號中的list comprehension來實(shí)現(xiàn):
a = (x**2 for x in range(10))
print a
>>> <generator object <genexpr> at 0x00000000042D2480>
Generator expression可以互相結(jié)合,速度較快线脚。
盡量用enumerate取代range
enumerate
可以把各種iterator包裝成generator赐稽,以便稍后產(chǎn)生輸出值叫榕。Generator每次產(chǎn)生一對輸出值,其中前者為循環(huán)下標(biāo)姊舵。