日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python高能小技巧:不要在for与while循环后面写else块

發布時間:2025/3/15 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python高能小技巧:不要在for与while循环后面写else块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

作者:布雷特·斯拉特金(Brett Slatkin)

來源:大數據DT(ID:hzdashuju)

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

for?i?in?range(3):print('Loop',?i) else:print('Else?block!') >>> Loop?0 Loop?1 Loop?2 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塊。

for?i?in?range(3):print('Loop',?i)if?i==1:break else:print('Else?b1ock!') >>> Loop?0 Loop?1

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

for?x?in?[]:print('Never?runs') else:print('For?Else?block!') >>> For?Else?block!

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

while?False:print('Never?runs') else:print('While?Else?block!') >>> While?Else?block!

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

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

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

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

def?coprime(a,?b):for?i?in?range(2,?min(a,?b)?+?1):if?a?%?i?==?0?and?b?%?i?==?0:return?Falsereturn?Trueassert?coprime(4,?9) assert?not?coprime(3,?6)

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

def?coprime_alternate(a,?b):is_coprime?=?Truefor?i?in?range(2,?min(a,?b)?+?1):if?a?%?i?==?0?and?b?%?i?==?0:is_coprime?=?Falsebreakreturn?is_coprime assert?coprime_alternate(4,?9) assert?not?coprime_alternate(3,?6)

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

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

要點

  • Python有種特殊的語法,可以把else塊緊跟在整個for循環或while循環的后面。

  • 只有在整個循環沒有因為break提前跳出的情況下,else塊才會執行。

  • 把else塊緊跟在整個循環后面,會讓人不太容易看出這段代碼的意思,所以要避免這樣寫。

關于作者:布雷特·斯拉特金(Brett Slatkin),Google首席軟件工程師,他是Google Surveys的聯合技術創始人,也是PubSubHubbub協議的共同創造者之一。此外,Slatkin還發布了Google的第一個云計算產品——App Engine。早在15年前,Slatkin就開始在工作中使用Python管理Google大量的服務器群。他擁有紐約哥倫比亞大學計算機工程專業學士學位。

本文摘編自《Effective Python:編寫高質量Python代碼的90個有效方法》(原書第2版),經出版方授權發布。

延伸閱讀《Effective Python》(原書第2版)

點擊上圖了解及購買

轉載請聯系微信:DoctorData

推薦語:Python編程進階必讀,基于Python3.8,新增31條建議!掌握Pythonic編程方式,寫出高質量代碼|進階到編程高手的程序員修煉之道和代碼整潔之道。

劃重點????

干貨直達????

  • 終于有人把量化投資講明白了

  • 人工智能時代都需要哪些數學知識?這些經典教材給你劃重點

  • 4種數據分析基礎方法,終于有人講明白了

  • 那兩個告扎克伯格抄襲的斜杠青年,后來怎么樣了?

更多精彩????

在公眾號對話框輸入以下關鍵詞

查看更多優質內容!

PPT?|?讀書?|?書單?|?硬核?|?干貨?|?講明白?|?神操作

大數據?|?云計算?|?數據庫?|?Python?|?可視化

AI?|?人工智能?|?機器學習?|?深度學習?|?NLP

5G?|?中臺?|?用戶畫像?|?1024?|?數學?|?算法?|?數字孿生

據統計,99%的大咖都關注了這個公眾號

????

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的Python高能小技巧:不要在for与while循环后面写else块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。