成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python技巧:不要在for與while循環后寫else塊

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

 [[385319]]

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

第一種寫法是,只要發現某個條件成立,就立刻返回,如果始終都沒碰到這種情況,那么循環就會完整地執行,讓程序返回函數末尾的那個值作為默認返回值。

  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) 

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

 

  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) 

 

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

for/else或while/else結構本身雖然可以實現某些邏輯表達,但它給讀者(也包括你自己)帶來的困惑,已經蓋過了它的好處。因為for與while循環這種簡單的結構,在Python里面讀起來應該相當明了才對,如果把else塊緊跟在它的后面,那就會讓代碼產生歧義。所以,請不要這么寫。

要點

  • Python有種特殊的語法,可以把else塊緊跟在整個for循環或while循環的后面。
  • 只有在整個循環沒有因為break提前跳出的情況下,else塊才會執行。
  • 把else塊緊跟在整個循環后面,會讓人不太容易看出這段代碼的意思,所以要避免這樣寫。

Python的循環有一項大多數編程語言都不支持的特性,即可以把else塊緊跟在整個循環結構的后面。

 

  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! 

 

奇怪的是,程序做完整個for循環之后,竟然會執行else塊里的內容。既然是這樣,那為什么要叫“else”呢?這應該叫“and”才對。在if/else結構里,else的意思是:如果沒執行前面那塊語句,那就執行else塊。在try/except結構里,except也是這個意思:如果前面那塊語句執行失敗,那就執行except塊。

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

了解了else、except、finally等在上面那些結構里的用法,Python新手可能就覺得,for/else結構里的else也是這個意思,即如果循環沒有從頭到尾執行完,那就執行else塊。實際上恰恰相反,如果循環沒有從頭到尾執行完(也就是循環提前終止了),那么else塊里的代碼是不會執行的。在循環中使用break語句實際上會跳過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 

 

還有一個奇怪的地方是,如果對空白序列做for循環,那么程序立刻就會執行else塊。

 

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

 

while循環也是這樣,如果首次循環就遇到False,那么程序也會立刻運行else塊。

 

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

 

把else設計成這樣,是想讓你利用它實現搜索邏輯。

例如,如果要判斷兩個數是否互質(也就是除了1之外,是不是沒有別的數能夠同時整除它們),就可以用這種結構實現。先把有可能同時整除它們的數逐個試一遍,如果全都試過之后還是沒找到這樣的數,那么循環就會從頭到尾執行完(這意味著循環沒有因為break而提前跳出),然后程序就會執行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 

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

第一種寫法是,只要發現某個條件成立,就立刻返回,如果始終都沒碰到這種情況,那么循環就會完整地執行,讓程序返回函數末尾的那個值作為默認返回值。

  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) 

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

 

  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) 

 

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

for/else或while/else結構本身雖然可以實現某些邏輯表達,但它給讀者(也包括你自己)帶來的困惑,已經蓋過了它的好處。因為for與while循環這種簡單的結構,在Python里面讀起來應該相當明了才對,如果把else塊緊跟在它的后面,那就會讓代碼產生歧義。所以,請不要這么寫。

要點

  • Python有種特殊的語法,可以把else塊緊跟在整個for循環或while循環的后面。
  • 只有在整個循環沒有因為break提前跳出的情況下,else塊才會執行。
  • 把else塊緊跟在整個循環后面,會讓人不太容易看出這段代碼的意思,所以要避免這樣寫。

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2018-07-16 16:29:26

編程函數代碼

2024-06-19 10:08:42

Python編程while循環

2022-08-10 14:36:05

Python循環函數

2013-11-27 09:16:28

編程結構

2021-01-28 09:55:50

while(1)for(;;)Linux

2021-03-17 11:16:58

while(1)for(;;)語言

2025-06-03 08:55:00

JavaScriptelse編程

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

語句elsePython

2020-12-11 05:57:01

Python循環語句代碼

2021-12-09 23:20:31

Python循環語句

2011-01-19 12:52:49

WCF.NETC#

2023-09-27 10:19:37

類型video函數

2021-03-24 13:17:41

編程循環語句Java

2023-04-20 13:59:01

Pythonwhile循環的

2012-09-06 09:21:22

編程語言技術

2010-09-08 17:00:22

SQLWHILE循環

2021-12-07 11:31:47

Python代碼if…elif…els
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品高潮呻吟久久av黑人 | 日韩久久综合网 | 日本高清不卡视频 | 涩涩视频网站在线观看 | 四虎成人在线播放 | 国产精品国产三级国产aⅴ原创 | 天天综合久久 | 日韩av在线一区二区 | 亚洲一区二区三区国产 | gav成人免费播放视频 | 欧美精三区欧美精三区 | 黄色日本片| 成人久久久久 | 久久精品免费 | 亚洲一区二区精品视频 | 蜜桃传媒av | 国产精品亚洲一区二区三区在线 | 国产精品 欧美精品 | 国产精品永久免费视频 | 亚洲精品欧美 | 国内精品视频在线观看 | 国产一级片在线播放 | 国户精品久久久久久久久久久不卡 | 亚洲成人观看 | 狠狠久 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 男女网站免费 | 干一干操一操 | 放个毛片看看 | 精品久久久999 | 久久亚洲一区二区三 | 国产日韩欧美一区 | 午夜精品一区 | 久久久av | 九七午夜剧场福利写真 | 色综合久久久久 | 成年人在线观看 | 精品在线 | 精品久久久一区二区 | 国产精品视频在线播放 | 欧美黄色小视频 |