- 確定所用的Python版本
Python2與3代碼是不兼容的账嚎。目前Python2的功能開發(fā)已經(jīng)停止愁溜,只會(huì)修復(fù)bug罐栈,而Python3不是足夠的穩(wěn)定。Python2適配到Python3的工具有2to3珠十、six等料扰。 - 遵循PEP8風(fēng)格指南
《Python Enhancement Proposal #8》簡稱PEP8,針對python代碼格式編訂的風(fēng)格指南焙蹭。
空白:
* 使用space來表示縮進(jìn)晒杈,而不是tab
* 每行字符數(shù)不應(yīng)超過79個(gè)字符
* 對于占據(jù)多行的長表達(dá)式,除了首行外壳嚎,其他行都應(yīng)再縮進(jìn)4個(gè)空格
* 文件中的函數(shù)與類之間應(yīng)該空兩行
* 同一個(gè)類中桐智,方法間應(yīng)空一個(gè)空行
* 在使用下標(biāo)來獲取列表元素、調(diào)用函數(shù)或給關(guān)鍵字參數(shù)賦值的時(shí)候烟馅,不要在旁加空格
命名:
* 函數(shù)说庭、變量、屬性應(yīng)該用小寫字母來拼寫郑趁,單詞間用下劃線連接
* 受保護(hù)的實(shí)例屬性刊驴,應(yīng)該用單個(gè)下劃線開頭
* 私有實(shí)例,應(yīng)該用兩個(gè)下劃線開頭
* 類與異常寡润,每個(gè)單詞首字母大寫
* 模塊級(jí)別的常量捆憎,所有單詞大寫,單詞間用下劃線連接
* 類中的實(shí)例方法梭纹,首個(gè)參數(shù)命名為self躲惰,表示該對象自身
* 類方法的首個(gè)參數(shù)命名為cls,表示該類自身
表達(dá)式和語句:
* 采用內(nèi)聯(lián)形式的否定詞变抽,而不是把否定詞放在整個(gè)表達(dá)式前础拨。例如:if a is not b 而不是 if not a is b
* 不要通過檢測長度的辦法來判斷列表是否為[]或者空值,而是if not somelist
* 不要編寫單杠的if語句绍载、for循環(huán)诡宗、while循環(huán)以及except復(fù)合語句,而是多行書寫击儡,閱讀更清晰
* import 語句應(yīng)該總是放在文件開頭
* 引入模塊的時(shí)候塔沃,應(yīng)該使用絕對名稱,而不是根據(jù)當(dāng)前模塊的路徑來使用相對的名稱
* 文件中import語句應(yīng)該分為三個(gè)部分阳谍,分別為標(biāo)準(zhǔn)庫蛀柴、第三方模塊和自用模塊螃概。每個(gè)部分,按模塊名稱的字母順序來排列
- 了解bytes鸽疾、str與unicode的區(qū)別
python3的兩種字符序列類型:bytes和str谅年。bytes為原始的8位字節(jié),str則包含unicode字符肮韧。
python2有兩種字符序列類型:str和unicode,str包含原始8位字節(jié)旺订。
關(guān)于這個(gè)請關(guān)注我的另一篇blog--《編碼問題以及其在Python2與3的差異》
想把unicode轉(zhuǎn)為二進(jìn)制數(shù)據(jù)弄企,使用encode方法,相反則使用decode方法 - 用輔助函數(shù)來取代復(fù)雜的表達(dá)式
表達(dá)式復(fù)雜了区拳,就拆分為小塊 - 了解切割序列的方法
- 在單次切片操作內(nèi)拘领,不要同時(shí)制定start、end和stride樱调。
list[start:end:stride] - 用列表推導(dǎo)來取代map和filter
[x+1 for x in list] - 不要使用含有兩個(gè)以上表達(dá)式的列表推導(dǎo)
- 用生成器表達(dá)式來改寫數(shù)據(jù)量較大的列表推導(dǎo)
- 盡量用enumerate取代range
enumerate可以把迭代器包裝為生成器约素,生成器產(chǎn)生一對值,前者為循環(huán)下標(biāo)笆凌,后者表示對應(yīng)的元素 - 用zip函數(shù)同時(shí)遍歷兩個(gè)迭代器
可以把兩個(gè)及以上的迭代器封裝為生成器圣猎,如果不等長,則以較短的迭代器為準(zhǔn)乞而。
itertools的zip_longest函數(shù)可以平行遍歷多個(gè)迭代器送悔。 - 不要在for和while循環(huán)后寫else
因?yàn)檠h(huán)后的else語句塊在循環(huán)結(jié)束后都會(huì)執(zhí)行,跟正常邏輯有點(diǎn)不一樣爪模。 - 合理利用try/except/else/finally結(jié)構(gòu)中代碼塊