自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python技巧:不要在for與while循環(huán)后寫else塊

開發(fā) 后端
本文會(huì)詳細(xì)介紹一個(gè)小技巧,幫助你用符合Python風(fēng)格的方式(Pythonic方式)來編寫程序。

 [[385319]]

實(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.  
  7. assert coprime(4, 9) 
  8. 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有種特殊的語(yǔ)法,可以把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ù)編程語(yǔ)言都不支持的特性,即可以把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í)行前面那塊語(yǔ)句,那就執(zhí)行else塊。在try/except結(jié)構(gòu)里,except也是這個(gè)意思:如果前面那塊語(yǔ)句執(zhí)行失敗,那就執(zhí)行except塊。

try/except/else結(jié)構(gòu)里的else依然遵循這樣的理念,它的意思是:如果沒有異常需要處理,那就執(zhí)行這塊語(yǔ)句。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語(yǔ)句實(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.  
  7. assert coprime(4, 9) 
  8. 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有種特殊的語(yǔ)法,可以把else塊緊跟在整個(gè)for循環(huán)或while循環(huán)的后面。
  • 只有在整個(gè)循環(huán)沒有因?yàn)閎reak提前跳出的情況下,else塊才會(huì)執(zhí)行。
  • 把else塊緊跟在整個(gè)循環(huán)后面,會(huì)讓人不太容易看出這段代碼的意思,所以要避免這樣寫。

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2018-07-16 16:29:26

編程函數(shù)代碼

2024-06-19 10:08:42

Python編程while循環(huán)

2022-08-10 14:36:05

Python循環(huán)函數(shù)

2013-11-27 09:16:28

編程結(jié)構(gòu)

2021-01-28 09:55:50

while(1)for(;;)Linux

2021-03-17 11:16:58

while(1)for(;;)語(yǔ)言

2024-04-15 12:27:00

await面試接口

2025-04-11 11:55:49

2015-10-10 10:36:00

warning category

2021-02-25 09:35:32

語(yǔ)句elsePython

2020-12-11 05:57:01

Python循環(huán)語(yǔ)句代碼

2021-12-09 23:20:31

Python循環(huán)語(yǔ)句

2021-03-24 13:17:41

編程循環(huán)語(yǔ)句Java

2023-04-20 13:59:01

Pythonwhile循環(huán)的

2011-01-19 12:52:49

WCF.NETC#

2023-09-27 10:19:37

類型video函數(shù)

2010-09-08 17:00:22

SQLWHILE循環(huán)

2012-09-06 09:21:22

編程語(yǔ)言技術(shù)

2024-12-19 16:00:00

Pythonwhile 循環(huán)

2021-12-07 11:31:47

Python代碼if…elif…els
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)