日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Python技巧:不要在for與while循環(huán)后寫else塊

實(shí)際工作中,筆者不會(huì)這樣寫,而是會(huì)改用輔助函數(shù)完成計(jì)算。這樣的輔助函數(shù)有兩種常見的寫法。

第一種寫法是,只要發(fā)現(xiàn)某個(gè)條件成立,就立刻返回,如果始終都沒碰到這種情況,那么循環(huán)就會(huì)完整地執(zhí)行,讓程序返回函數(shù)末尾的那個(gè)值作為默認(rèn)返回值。

 
 
  1. def coprime(a, b):
  2.     for i in range(2, min(a, b) + 1):
  3.         if a % i == 0 and b % i == 0:
  4.             return False
  5.     return True
  6. assert coprime(4, 9)
  7. assert not coprime(3, 6)

第二種寫法是,用變量來記錄循環(huán)過程中有沒有碰到這樣的情況,如果有,那就用break提前跳出循環(huán),如果沒有,循環(huán)就會(huì)完整地執(zhí)行,無論如何,最后都返回這個(gè)變量的值。

 
 
  1. def coprime_alternate(a, b):
  2.     is_coprime = True
  3.     for i in range(2, min(a, b) + 1):
  4.         if a % i == 0 and b % i == 0:
  5.             is_coprime = False
  6.             break
  7.     return is_coprime
  8. assert coprime_alternate(4, 9)
  9. assert not coprime_alternate(3, 6)

對(duì)于不熟悉for/else結(jié)構(gòu)的人來說,剛才那兩種寫法都是比較清晰的方案,大家可以根據(jù)情況選擇其中的一種。

for/else或while/else結(jié)構(gòu)本身雖然可以實(shí)現(xiàn)某些邏輯表達(dá),但它給讀者(也包括你自己)帶來的困惑,已經(jīng)蓋過了它的好處。因?yàn)閒or與while循環(huán)這種簡(jiǎn)單的結(jié)構(gòu),在Python里面讀起來應(yīng)該相當(dāng)明了才對(duì),如果把else塊緊跟在它的后面,那就會(huì)讓代碼產(chǎn)生歧義。所以,請(qǐng)不要這么寫。

要點(diǎn)

  • Python有種特殊的語法,可以把else塊緊跟在整個(gè)for循環(huán)或while循環(huán)的后面。
  • 只有在整個(gè)循環(huán)沒有因?yàn)閎reak提前跳出的情況下,else塊才會(huì)執(zhí)行。
  • 把else塊緊跟在整個(gè)循環(huán)后面,會(huì)讓人不太容易看出這段代碼的意思,所以要避免這樣寫。

Python的循環(huán)有一項(xiàng)大多數(shù)編程語言都不支持的特性,即可以把else塊緊跟在整個(gè)循環(huán)結(jié)構(gòu)的后面。

 
 
  1. for i in range(3):
  2.     print('Loop', i)
  3. else:
  4.     print('Else block!')
  5. >>>
  6. Loop 0
  7. Loop 1
  8. Loop 2
  9. Else block!

奇怪的是,程序做完整個(gè)for循環(huán)之后,竟然會(huì)執(zhí)行else塊里的內(nèi)容。既然是這樣,那為什么要叫“else”呢?這應(yīng)該叫“and”才對(duì)。在if/else結(jié)構(gòu)里,else的意思是:如果沒執(zhí)行前面那塊語句,那就執(zhí)行else塊。在try/except結(jié)構(gòu)里,except也是這個(gè)意思:如果前面那塊語句執(zhí)行失敗,那就執(zhí)行except塊。

try/except/else結(jié)構(gòu)里的else依然遵循這樣的理念,它的意思是:如果沒有異常需要處理,那就執(zhí)行這塊語句。try/finally結(jié)構(gòu)里的finally同樣很直觀,意思是:不管前面那塊代碼執(zhí)行得如何,最后都要執(zhí)行finally塊代碼。

了解了else、except、finally等在上面那些結(jié)構(gòu)里的用法,Python新手可能就覺得,for/else結(jié)構(gòu)里的else也是這個(gè)意思,即如果循環(huán)沒有從頭到尾執(zhí)行完,那就執(zhí)行else塊。實(shí)際上恰恰相反,如果循環(huán)沒有從頭到尾執(zhí)行完(也就是循環(huán)提前終止了),那么else塊里的代碼是不會(huì)執(zhí)行的。在循環(huán)中使用break語句實(shí)際上會(huì)跳過else塊。

 
 
  1. for i in range(3):
  2.     print('Loop', i)
  3.     if i==1:
  4.         break
  5. else:
  6.     print('Else b1ock!')
  7. >>>
  8. Loop 0
  9. Loop 1

還有一個(gè)奇怪的地方是,如果對(duì)空白序列做for循環(huán),那么程序立刻就會(huì)執(zhí)行else塊。

 
 
  1. for x in []:
  2.     print('Never runs')
  3. else:
  4.     print('For Else block!')
  5. >>>
  6. For Else block!

while循環(huán)也是這樣,如果首次循環(huán)就遇到False,那么程序也會(huì)立刻運(yùn)行else塊。

 
 
  1. while False:
  2.     print('Never runs')
  3. else:
  4.     print('While Else block!')
  5. >>>
  6. While Else block!

把else設(shè)計(jì)成這樣,是想讓你利用它實(shí)現(xiàn)搜索邏輯。

例如,如果要判斷兩個(gè)數(shù)是否互質(zhì)(也就是除了1之外,是不是沒有別的數(shù)能夠同時(shí)整除它們),就可以用這種結(jié)構(gòu)實(shí)現(xiàn)。先把有可能同時(shí)整除它們的數(shù)逐個(gè)試一遍,如果全都試過之后還是沒找到這樣的數(shù),那么循環(huán)就會(huì)從頭到尾執(zhí)行完(這意味著循環(huán)沒有因?yàn)閎reak而提前跳出),然后程序就會(huì)執(zhí)行else塊里的代碼。

 
 
  1. a = 4
  2. b = 9
  3. for i in range(2, min(a, b) + 1):
  4.     print('Testing',i)
  5.     if a % i == 0 and b % i == 0:
  6.         print('Not coprime')
  7.         break
  8. else:
  9.     print('Coprime')
  10. >>>
  11. Testing 2
  12. Testing 3
  13. Testing 4
  14. Coprime

實(shí)際工作中,筆者不會(huì)這樣寫,而是會(huì)改用輔助函數(shù)完成計(jì)算。這樣的輔助函數(shù)有兩種常見的寫法。

第一種寫法是,只要發(fā)現(xiàn)某個(gè)條件成立,就立刻返回,如果始終都沒碰到這種情況,那么循環(huán)就會(huì)完整地執(zhí)行,讓程序返回函數(shù)末尾的那個(gè)值作為默認(rèn)返回值。

 
 
  1. def coprime(a, b):
  2.     for i in range(2, min(a, b) + 1):
  3.         if a % i == 0 and b % i == 0:
  4.             return False
  5.     return True
  6. assert coprime(4, 9)
  7. assert not coprime(3, 6)

第二種寫法是,用變量來記錄循環(huán)過程中有沒有碰到這樣的情況,如果有,那就用break提前跳出循環(huán),如果沒有,循環(huán)就會(huì)完整地執(zhí)行,無論如何,最后都返回這個(gè)變量的值。

 
 
  1. def coprime_alternate(a, b):
  2.     is_coprime = True
  3.     for i in range(2, min(a, b) + 1):
  4.         if a % i == 0 and b % i == 0:
  5.             is_coprime = False
  6.             break
  7.     return is_coprime
  8. assert coprime_alternate(4, 9)
  9. assert not coprime_alternate(3, 6)

對(duì)于不熟悉for/else結(jié)構(gòu)的人來說,剛才那兩種寫法都是比較清晰的方案,大家可以根據(jù)情況選擇其中的一種。

for/else或while/else結(jié)構(gòu)本身雖然可以實(shí)現(xiàn)某些邏輯表達(dá),但它給讀者(也包括你自己)帶來的困惑,已經(jīng)蓋過了它的好處。因?yàn)閒or與while循環(huán)這種簡(jiǎn)單的結(jié)構(gòu),在Python里面讀起來應(yīng)該相當(dāng)明了才對(duì),如果把else塊緊跟在它的后面,那就會(huì)讓代碼產(chǎn)生歧義。所以,請(qǐng)不要這么寫。

要點(diǎn)

  • Python有種特殊的語法,可以把else塊緊跟在整個(gè)for循環(huán)或while循環(huán)的后面。
  • 只有在整個(gè)循環(huán)沒有因?yàn)閎reak提前跳出的情況下,else塊才會(huì)執(zhí)行。
  • 把else塊緊跟在整個(gè)循環(huán)后面,會(huì)讓人不太容易看出這段代碼的意思,所以要避免這樣寫。

分享文章:Python技巧:不要在for與while循環(huán)后寫else塊
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/dhcepcg.html