原文地址:https://www.hz-bin.cn/Effective_Python_1
第1條 查詢(xún)自己使用的Python版本
root@ubuntu:~# python --version
Python 2.7.17
root@ubuntu:~# python3 --version
Python 3.6.9
第2條 遵循PEP 8風(fēng)格指南
https://www.python.org/dev/peps/pep-0008
- 編寫(xiě)Python代碼時(shí)闲孤,總是應(yīng)該遵循PEP 8風(fēng)格指南烤礁。
- 與廣大Python開(kāi)發(fā)者采用同一套代碼風(fēng)格,可以使項(xiàng)目更利于多人協(xié)作脚仔。
- 采用一致的風(fēng)格編寫(xiě)代碼,代碼的后續(xù)修改更容易们颜。
第3條 了解bytes與str的區(qū)別
- bytes包含的是由8位值所組成的序列猎醇,str包含的是由Unicode碼點(diǎn)所組成的序列。
- 我們可以編寫(xiě)輔助函數(shù)來(lái)確保程序收到的字符序列確實(shí)是期望要操作的類(lèi)型(要知道自己想操作的到底是Unicode碼點(diǎn)硫嘶,還是原始的8位值。用UTF-8標(biāo)準(zhǔn)給字符串編碼称近,得到的就是這樣的一系列8位值)第队。
- bytes與str這兩種實(shí)例不能在某些操作符(例如>凳谦、==坛善、+、%操作符)上面混用眠屎。
- 從文件中讀取二進(jìn)制數(shù)據(jù)(或者把二進(jìn)制數(shù)據(jù)寫(xiě)入文件)時(shí)改衩,應(yīng)該用'rb'('wb')這樣的二進(jìn)制模式打開(kāi)文件驯镊。
- 如果要從文件中讀取(或者要寫(xiě)入文件之中)的是Unicode數(shù)據(jù)板惑,那么必須注意系統(tǒng)默認(rèn)的文本編碼方案。若無(wú)法肯定洽胶,可通過(guò)encoding參數(shù)明確指定。
第4條 用支持插值的f-string取代C風(fēng)格的格式字符串與str.format方法
a = 1
b = 2
# C風(fēng)格
print('a=%d, b=%d', a, b)
# str.format
print('a={}, b={}'.format(a, b))
# f-string姊氓,Python 3.6 新增的特性
print(f'a={a}, b=喷好')
第5條 用輔助函數(shù)取代復(fù)雜的表達(dá)式
- Python的語(yǔ)法很容易把復(fù)雜的意思擠到同一行表達(dá)式里,這樣寫(xiě)很難懂禾唁。復(fù)雜的表達(dá)式,尤其是那種需要重復(fù)使用的復(fù)雜表達(dá)式荡短,應(yīng)該寫(xiě)到輔助函數(shù)里面订雾。
- 用if/else結(jié)構(gòu)寫(xiě)成的條件表達(dá)式,要比用or與and寫(xiě)成的Boolean表達(dá)式更好懂
第6條 把數(shù)據(jù)結(jié)構(gòu)直接拆分到多個(gè)變量里洼哎,不要專(zhuān)門(mén)通過(guò)下標(biāo)訪(fǎng)問(wèn)
item = ('a', 'b', 'c')
a, b, c = item
snacks = [('bacon', 350), ('donut', 240), ('muffin', 190)]
for rank, (name, calories) in enumerate(snacks, 1):
print(f'#{rank}: {name} has {calories} calories')
"""輸出
#1: bacon has 350 calories
#2: donut has 240 calories
#3: muffin has 190 calories
"""
- unpacking是一種特殊的Python語(yǔ)法沼本,只需要一行代碼抽兆,就能把數(shù)據(jù)結(jié)構(gòu)里面的多個(gè)值分別賦給相應(yīng)的變量族淮。
- unpacking在Python中應(yīng)用廣泛,凡是可迭代的對(duì)象都能拆分祝辣,無(wú)論它里面還有多少層迭代結(jié)構(gòu)。
- 盡量通過(guò)unpacking來(lái)拆解序列之中的數(shù)據(jù)名惩,而不要通過(guò)下標(biāo)訪(fǎng)問(wèn),這樣可以讓代碼更簡(jiǎn)潔娩鹉、更清晰稚伍。
第7條 盡量用enumerate取代range
- Python內(nèi)置的range函數(shù)適合用來(lái)迭代一系列整數(shù)。
flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']
for flavor in flavor_list:
print(f'{flavor} is delicious')
for i, flavor in enumerate(flavor_list):
print(f'{i + 1}: {flavor}')
for i, flavor in enumerate(flavor_list, 1):
print(f'{i}: {flavor}')
"""輸出
1: vanilla
2: chocolate
3: pecan
4: strawberry
"""
- enumerate函數(shù)可以用簡(jiǎn)潔的代碼迭代iterator锈嫩,而且可以指出當(dāng)前這輪循環(huán)的序號(hào)。
- 不要先通過(guò)range指定下標(biāo)的取值范圍祠挫,然后用下標(biāo)去訪(fǎng)問(wèn)序列悼沿,而是應(yīng)該直接用enumerate函數(shù)迭代。
- 可以通過(guò)enumerate的第二個(gè)參數(shù)指定起始序號(hào)(默認(rèn)為0)糟趾。
第8條 用zip函數(shù)同時(shí)遍歷兩個(gè)迭代器
names = ['Cecilia', 'Lise', 'Marie']
counts = [len(n) for n in names]
for name, count in zip(names, counts):
print(f'{name}: {count}')
"""輸出
Cecilia: 7
Lise: 4
Marie: 5
"""
names.append('Rosalind')
import itertools
for name, count in itertools.zip_longest(names, counts):
print(f'{name}: {count}')
"""輸出
Cecilia: 7
Lise: 4
Marie: 5
Rosalind: None
"""
- 內(nèi)置的zip函數(shù)可以同時(shí)遍歷多個(gè)迭代器。
- zip會(huì)創(chuàng)建惰性生成器蝶柿,讓它每次只生成一個(gè)元組非驮,所以無(wú)論輸入的數(shù)據(jù)有多長(zhǎng),它都是一個(gè)一個(gè)處理的。
- 如果提供的迭代器的長(zhǎng)度不一致星岗,那么只要其中任何一個(gè)迭代完畢戒洼,zip就會(huì)停止。
- 如果想按最長(zhǎng)的那個(gè)迭代器來(lái)遍歷圈浇,那就改用內(nèi)置的itertools模塊中的zip_longest函數(shù)。
第9條 不要在for與while循環(huán)后面寫(xiě)else塊
- Python有種特殊的語(yǔ)法磷蜀,可以把else塊緊跟在整個(gè)for循環(huán)或while循環(huán)的后面。
- 只有在整個(gè)循環(huán)沒(méi)有因?yàn)閎reak提前跳出的情況下怎茫,else塊才會(huì)執(zhí)行妓灌。
- 把else塊緊跟在整個(gè)循環(huán)后面蜜宪,會(huì)讓人不太容易看出這段代碼的意思,所以要避免這樣寫(xiě)圃验。
第10條 用賦值表達(dá)式減少重復(fù)代碼
- 賦值表達(dá)式(assignment expression)是Python 3.8新引入的語(yǔ)法
a = b # 普通的賦值語(yǔ)句
a := b # 賦值表達(dá)式
fresh_fruit = {
'apple': 10,
'banana': 8,
'lemon': 5,
}
if (count := fresh_fruit.get('apple', 0)) >= 10:
print('apple')
def pick_fruit():
pass
while fresh_fruit := pick_fruit():
print(fresh_fruit)
- 賦值表達(dá)式通過(guò)海象操作符(:=)給變量賦值,并且讓這個(gè)值成為這條表達(dá)式的結(jié)果斧散,于是摊聋,我們可以利用這項(xiàng)特性來(lái)縮減代碼。
- 如果賦值表達(dá)式是大表達(dá)式里的一部分麻裁,就得用一對(duì)括號(hào)把它括起來(lái)。雖說(shuō)Python不支持switch/case與do/while結(jié)構(gòu)色迂,但可以利用賦值表達(dá)式清晰地模擬出這種邏輯。