這篇文章主要講解了“為什么不要在for與while循環(huán)后寫(xiě)else塊”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“為什么不要在for與while循環(huán)后寫(xiě)else塊”吧!
創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元湯原做網(wǎng)站,已為上家服務(wù),為湯原各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
實(shí)際工作中,筆者不會(huì)這樣寫(xiě),而是會(huì)改用輔助函數(shù)完成計(jì)算。這樣的輔助函數(shù)有兩種常見(jiàn)的寫(xiě)法。
第一種寫(xiě)法是,只要發(fā)現(xiàn)某個(gè)條件成立,就立刻返回,如果始終都沒(méi)碰到這種情況,那么循環(huán)就會(huì)完整地執(zhí)行,讓程序返回函數(shù)末尾的那個(gè)值作為默認(rèn)返回值。
def coprime(a, b): for i in range(2, min(a, b) + 1): if a % i == 0 and b % i == 0: return False return True assert coprime(4, 9) assert not coprime(3, 6)
第二種寫(xiě)法是,用變量來(lái)記錄循環(huán)過(guò)程中有沒(méi)有碰到這樣的情況,如果有,那就用break提前跳出循環(huán),如果沒(méi)有,循環(huán)就會(huì)完整地執(zhí)行,無(wú)論如何,最后都返回這個(gè)變量的值。
def coprime_alternate(a, b): is_coprime = True for i in range(2, min(a, b) + 1): if a % i == 0 and b % i == 0: is_coprime = False break return is_coprime assert coprime_alternate(4, 9) assert not coprime_alternate(3, 6)
對(duì)于不熟悉for/else結(jié)構(gòu)的人來(lái)說(shuō),剛才那兩種寫(xiě)法都是比較清晰的方案,大家可以根據(jù)情況選擇其中的一種。
for/else或while/else結(jié)構(gòu)本身雖然可以實(shí)現(xiàn)某些邏輯表達(dá),但它給讀者(也包括你自己)帶來(lái)的困惑,已經(jīng)蓋過(guò)了它的好處。因?yàn)閒or與while循環(huán)這種簡(jiǎn)單的結(jié)構(gòu),在Python里面讀起來(lái)應(yīng)該相當(dāng)明了才對(duì),如果把else塊緊跟在它的后面,那就會(huì)讓代碼產(chǎn)生歧義。所以,請(qǐng)不要這么寫(xiě)。
要點(diǎn)
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ě)。
Python的循環(huán)有一項(xiàng)大多數(shù)編程語(yǔ)言都不支持的特性,即可以把else塊緊跟在整個(gè)循環(huán)結(jié)構(gòu)的后面。
for i in range(3): print('Loop', i) else: print('Else block!') >>> Loop 0 Loop 1 Loop 2 Else block!
奇怪的是,程序做完整個(gè)for循環(huán)之后,竟然會(huì)執(zhí)行else塊里的內(nèi)容。既然是這樣,那為什么要叫“else”呢?這應(yīng)該叫“and”才對(duì)。在if/else結(jié)構(gòu)里,else的意思是:如果沒(méi)執(zhí)行前面那塊語(yǔ)句,那就執(zhí)行else塊。在try/except結(jié)構(gòu)里,except也是這個(gè)意思:如果前面那塊語(yǔ)句執(zhí)行失敗,那就執(zhí)行except塊。
try/except/else結(jié)構(gòu)里的else依然遵循這樣的理念,它的意思是:如果沒(méi)有異常需要處理,那就執(zhí)行這塊語(yǔ)句。try/finally結(jié)構(gòu)里的finally同樣很直觀,意思是:不管前面那塊代碼執(zhí)行得如何,最后都要執(zhí)行finally塊代碼。
了解了else、except、finally等在上面那些結(jié)構(gòu)里的用法,Python新手可能就覺(jué)得,for/else結(jié)構(gòu)里的else也是這個(gè)意思,即如果循環(huán)沒(méi)有從頭到尾執(zhí)行完,那就執(zhí)行else塊。實(shí)際上恰恰相反,如果循環(huán)沒(méi)有從頭到尾執(zhí)行完(也就是循環(huán)提前終止了),那么else塊里的代碼是不會(huì)執(zhí)行的。在循環(huán)中使用break語(yǔ)句實(shí)際上會(huì)跳過(guò)else塊。
for i in range(3): print('Loop', i) if i==1: break else: print('Else b1ock!') >>> Loop 0 Loop 1
還有一個(gè)奇怪的地方是,如果對(duì)空白序列做for循環(huán),那么程序立刻就會(huì)執(zhí)行else塊。
for x in []: print('Never runs') else: print('For Else block!') >>> For Else block!
while循環(huán)也是這樣,如果首次循環(huán)就遇到False,那么程序也會(huì)立刻運(yùn)行else塊。
while False: print('Never runs') else: print('While Else block!') >>> While Else block!
把else設(shè)計(jì)成這樣,是想讓你利用它實(shí)現(xiàn)搜索邏輯。
例如,如果要判斷兩個(gè)數(shù)是否互質(zhì)(也就是除了1之外,是不是沒(méi)有別的數(shù)能夠同時(shí)整除它們),就可以用這種結(jié)構(gòu)實(shí)現(xiàn)。先把有可能同時(shí)整除它們的數(shù)逐個(gè)試一遍,如果全都試過(guò)之后還是沒(méi)找到這樣的數(shù),那么循環(huán)就會(huì)從頭到尾執(zhí)行完(這意味著循環(huán)沒(méi)有因?yàn)閎reak而提前跳出),然后程序就會(huì)執(zhí)行else塊里的代碼。
a = 4 b = 9 for i in range(2, min(a, b) + 1): print('Testing',i) if a % i == 0 and b % i == 0: print('Not coprime') break else: print('Coprime') >>> Testing 2 Testing 3 Testing 4 Coprime
實(shí)際工作中,筆者不會(huì)這樣寫(xiě),而是會(huì)改用輔助函數(shù)完成計(jì)算。這樣的輔助函數(shù)有兩種常見(jiàn)的寫(xiě)法。
第一種寫(xiě)法是,只要發(fā)現(xiàn)某個(gè)條件成立,就立刻返回,如果始終都沒(méi)碰到這種情況,那么循環(huán)就會(huì)完整地執(zhí)行,讓程序返回函數(shù)末尾的那個(gè)值作為默認(rèn)返回值。
def coprime(a, b): for i in range(2, min(a, b) + 1): if a % i == 0 and b % i == 0: return False return True assert coprime(4, 9) assert not coprime(3, 6)
第二種寫(xiě)法是,用變量來(lái)記錄循環(huán)過(guò)程中有沒(méi)有碰到這樣的情況,如果有,那就用break提前跳出循環(huán),如果沒(méi)有,循環(huán)就會(huì)完整地執(zhí)行,無(wú)論如何,最后都返回這個(gè)變量的值。
def coprime_alternate(a, b): is_coprime = True for i in range(2, min(a, b) + 1): if a % i == 0 and b % i == 0: is_coprime = False break return is_coprime assert coprime_alternate(4, 9) assert not coprime_alternate(3, 6)
對(duì)于不熟悉for/else結(jié)構(gòu)的人來(lái)說(shuō),剛才那兩種寫(xiě)法都是比較清晰的方案,大家可以根據(jù)情況選擇其中的一種。
for/else或while/else結(jié)構(gòu)本身雖然可以實(shí)現(xiàn)某些邏輯表達(dá),但它給讀者(也包括你自己)帶來(lái)的困惑,已經(jīng)蓋過(guò)了它的好處。因?yàn)閒or與while循環(huán)這種簡(jiǎn)單的結(jié)構(gòu),在Python里面讀起來(lái)應(yīng)該相當(dāng)明了才對(duì),如果把else塊緊跟在它的后面,那就會(huì)讓代碼產(chǎn)生歧義。所以,請(qǐng)不要這么寫(xiě)。
要點(diǎn)
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ě)。
感謝各位的閱讀,以上就是“為什么不要在for與while循環(huán)后寫(xiě)else塊”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)為什么不要在for與while循環(huán)后寫(xiě)else塊這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!