Effective Python 讀書(shū)筆記 - 第1章 培養(yǎng)Pythonic思維

原文地址: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á)式清晰地模擬出這種邏輯。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歇僧,一起剝皮案震驚了整個(gè)濱河市锋拖,隨后出現(xiàn)的幾起案子祸轮,更是在濱河造成了極大的恐慌写隶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痪蝇,死亡現(xiàn)場(chǎng)離奇詭異冕房,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耙册,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)详拙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人饶辙,你說(shuō)我怎么就攤上這事∑浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵痕慢,是天一觀的道長(zhǎng)涌矢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蒿辙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任俺叭,我火速辦了婚禮,結(jié)果婚禮上熄守,老公的妹妹穿的比我還像新娘。我一直安慰自己裕照,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布惠猿。 她就那樣靜靜地躺著负间,像睡著了一般。 火紅的嫁衣襯著肌膚如雪政溃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天扼鞋,我揣著相機(jī)與錄音,去河邊找鬼云头。 笑死淫半,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撮慨。 我是一名探鬼主播脆粥,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼规伐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猖闪,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肌厨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后柑爸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馅而,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雄坪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屯蹦。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颇玷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帖渠,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布份招,位于F島的核電站,受9級(jí)特大地震影響锁摔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谐腰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一涩盾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧春霍,春花似錦、人聲如沸址儒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蝶涩,卻和暖如春理朋,著一層夾襖步出監(jiān)牢的瞬間绿聘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工兽愤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浅萧。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓哲思,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親棚赔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容