-
第十條:盡量用enumerate取代range
迭代時(shí),兩種方法:
1.range
在一系列整數(shù)上迭代時(shí),內(nèi)置的range函數(shù)很有用。如果想要獲取索引時(shí),較為復(fù)雜,代碼繁瑣且不易理解
2.enumerate
python內(nèi)置函數(shù),可以為此函數(shù)提供第二個(gè)參數(shù),以指定開始計(jì)數(shù)時(shí)所用的值(默認(rèn)為0)推薦用此。
舉個(gè)栗子,對(duì)比一目了然:
圖片.png
-
第十一條:用zip函數(shù)同時(shí)遍歷兩個(gè)迭代器
舉個(gè)栗子:
圖片.png
通過比較,可以得出:
(1)zip函數(shù)較為簡(jiǎn)潔易懂,zip可以平行的遍歷多個(gè)迭代器
(2)問題:
<1>在python2中,zip函數(shù)不是生成器,而是會(huì)把開發(fā)者提供的迭代器,都平行遍歷一次,在此過程中,他會(huì)把迭代器所產(chǎn)生的值匯聚成元組,并把那些元組所構(gòu)成的列表完整的返回給調(diào)用者。---這樣會(huì)產(chǎn)生大量?jī)?nèi)存,導(dǎo)致程序崩潰。
所以,在python2中想要遍歷非常大的迭代器,應(yīng)該使用itertools內(nèi)置模塊的izip函數(shù)。
(2)如果提供的迭代器長(zhǎng)度不等,那么zip就會(huì)自動(dòng)提前終止。舉個(gè)栗子:
圖片.png
解決辦法:itertools內(nèi)置模塊zip_longest函數(shù),他可以平行的遍歷多個(gè)迭代器,而不用在乎他們的長(zhǎng)度是否相等。
-
第十二條:不要在for和while循環(huán)后面寫else塊
Python 提供了一種獨(dú)特的功能,即可以在循環(huán)內(nèi)部的語句塊后面直接編寫else塊。
(1)if/else:else意思是如果不執(zhí)行if,則else;反之亦然。try/except同理
(2)try/except/else:else意思是:如果前面的try塊沒有失敗,那就執(zhí)行else塊。
try/finally同樣,finally意思是執(zhí)行過前面的try之后,總是執(zhí)行finally.
(3)for/else:只有當(dāng)整個(gè)循環(huán)主體都沒遇到break語句時(shí),循環(huán)后面的else才會(huì)執(zhí)行。
(4)不要在循環(huán)后面使用else塊,因?yàn)檫@種寫法既不直觀,又容易引人誤解。
舉個(gè)栗子:
圖片.png
我們不要這樣寫,而應(yīng)該:
圖片.png
或者:
圖片.png
注意:盡量不要在這種循環(huán)后面寫else語句,不要給自己挖坑
好了,本回依舊是學(xué)習(xí)三條。
說明:沒回存在的問題會(huì)在整本書都學(xué)完之后再做分析與補(bǔ)充。
天氣雖然炎熱,依舊要靜心學(xué)習(xí),每周進(jìn)步一點(diǎn)點(diǎn),加油
ps:在編寫第十條的冰淇淋口味的例子時(shí),自己默默的咽了好幾次口水,冰激凌對(duì)我真的是太有誘惑力了(尷尬hhhh)
因?yàn)檫@本書是kevin師兄推薦我看的,以此記錄學(xué)習(xí)過程也是表示對(duì)師兄的感謝。