Python中跳出循環(huán)的兩種方法
我們經(jīng)常遇到循環(huán)在進(jìn)行到某一個(gè)特定的值時(shí),需要跳出循環(huán),或跳過(guò)這個(gè)值,python中早已為我們準(zhǔn)備了這樣的參數(shù):break,continue
比如下面的for循環(huán):
for i in range(1,10): print('循環(huán)了',i,'次')
結(jié)果顯而易見(jiàn)如圖:
當(dāng)我們想在第三次結(jié)束這個(gè)循環(huán)時(shí)可以用break這個(gè)參數(shù)來(lái)跳出循環(huán),代碼如下
for i in range(1,10): if i==3: break else: print('循環(huán)了',i,'次')
這是for循環(huán)就只會(huì)進(jìn)行兩次循環(huán)就會(huì)停止,如果如下:
還有一種參數(shù)continue,這個(gè)參數(shù)表示的是跳出本次循環(huán),即本次循環(huán)不參與運(yùn)算,代碼使用如下:
for i in range(1,10): if i==3: continue else: print('循環(huán)了',i,'次')
結(jié)果如下:
當(dāng)i=3時(shí),循環(huán)是不進(jìn)行的也就沒(méi)有了輸出結(jié)果。
拓展:Python 跳出嵌套循環(huán)的5種方法
很多人說(shuō) Python 是給很優(yōu)雅的語(yǔ)言,但凡事都有個(gè)弱點(diǎn),有些時(shí)候?qū)τ谀撤N情況,用 Python 實(shí)現(xiàn)起來(lái)卻不那么"優(yōu)雅"。
例如下面的例子,我們想要跳出這個(gè)嵌套循環(huán):
for a in list_a: for b in list_b: if condition(a,b): break
關(guān)鍵詞 break 只能跳出這個(gè)循環(huán)中的內(nèi)循環(huán)。那有沒(méi)有什么方法一次性跳出所有循環(huán)? Python 里有沒(méi)有哪個(gè)內(nèi)置的關(guān)鍵詞可以實(shí)現(xiàn)呢?
不幸的的是,沒(méi)有。
有句老話講的好,"沒(méi)有對(duì)比就沒(méi)有傷害", Python 做不到,其它的語(yǔ)言卻可以,比如萬(wàn)人鄙視的 PHP:
foreach ($a_list as $a) { foreach ($b_list as $b) { if (condition($a, $b)) { break 2; // 跳出兩次循環(huán) } } }
在 PHP 里 break 關(guān)鍵詞后面跟著一個(gè)數(shù)組,表示要跳出循環(huán)的次數(shù),默認(rèn)值是1,表示跳出一次循環(huán)。
這是一個(gè)很簡(jiǎn)潔命令的解決方案,這里必須夸一句 PHP,這里它表現(xiàn)的不錯(cuò)。
不過(guò) Python 畢竟是很靈活的語(yǔ)言,我們有很多方法可以解決上面的問(wèn)題,下面我就介紹 5 中跳出嵌套循環(huán)的方法。
1. 使用"旗幟"變量
這是個(gè)有效的解決方案,我們定義一個(gè)變量,作為一個(gè)"旗幟",例如:
# 添加"旗幟"變量 break_out_flag = False for i in range(5): for j in range(5): if j == 2 and i == 0: break_out_flag = True break if break_out_flag: break
如上面的代碼,break_out_flag 作為一個(gè)"旗手"告訴這個(gè)程序該跳出這個(gè)外循環(huán)了。
這個(gè)代碼在執(zhí)行上沒(méi)什么問(wèn)題,不過(guò)這顯得我們的代碼有點(diǎn)亂,因?yàn)槲覀円昧诵碌淖兞咳ソ鉀Q這個(gè)問(wèn)題,這個(gè)新變量并非非要引入的。
2. 引發(fā)異常
如果 break 關(guān)鍵詞不能達(dá)到我們的期望,那么是否可以引入其他的操作呢,比如 Python 的異常處理技術(shù),我們可以使用它跳出嵌套循環(huán):
# 引發(fā)異常 try: for i in range(5): for j in range(5): if j == 2 and i == 0: raise StopIteration except StopIteration: pass
就如上面代碼所示,我們把異常"exception"當(dāng)做關(guān)鍵詞 break 使用,這樣就可以一次跳出所有循環(huán)。
3. 使用相同的條件語(yǔ)句
由于一個(gè)條件語(yǔ)句可以中斷一次循環(huán),那么使用相同的條件語(yǔ)句同樣也可以再一次中斷一個(gè)循環(huán),例如:
# 使用相同的條件語(yǔ)句 for i in range(5): for j in range(5): if j == 2 and i == 0: break if j == 2 and i == 0: break
上面的代碼可行,但并不是一個(gè)好的解決方案,至少在效率上很差,因?yàn)橹貜?fù)執(zhí)行一個(gè)條件語(yǔ)句會(huì)浪費(fèi)很多時(shí)間。
4. 使用 For-Else 語(yǔ)句
Python 里有一個(gè)很特殊的語(yǔ)句:"for-else"。 它并不流行以至于很少有人知道它,因?yàn)榱?xí)慣上 else 是搭配 if 來(lái)使用。
不過(guò)對(duì)于這個(gè)問(wèn)題,它卻是很有幫助:
# 使用 For-Else 語(yǔ)句 for i in range(5): for j in range(5): if j == 2 and i == 0: break else: # 僅在內(nèi)循環(huán)不中斷時(shí)執(zhí)行 continue break
上面的代碼中顯示了 for-else 語(yǔ)句的優(yōu)勢(shì),因?yàn)?else 下面的語(yǔ)句只有當(dāng)內(nèi)循環(huán)執(zhí)行完成并沒(méi)有任何中斷的時(shí)候才執(zhí)行。
如果對(duì) for-else 還不熟悉,可以看一下下面的代碼,是 for-else "翻譯"過(guò)來(lái)的寫(xiě)法:
# 和 for-else 一樣的 for i in range(5): for j in range(5): if j == 2 and i == 0: break if not (j == 2 and i == 0): continue break
總之,這個(gè)方法很可以,就是 for-else 這種形式不好理解。
5. 將嵌套循環(huán)放在一個(gè)函數(shù)里
如果我們將嵌套循環(huán)放在一個(gè)函數(shù)中,那么跳出嵌套循環(huán)是非常簡(jiǎn)單的,因?yàn)槲覀兛梢允褂?return 這個(gè)關(guān)鍵詞替代 break 。
# 將嵌套循環(huán)放在一個(gè)函數(shù)里 def check_sth(): for i in range(5): for j in range(5): if j == 2 and i == 0: return check_sth() # 執(zhí)行這個(gè)函數(shù)
如上所示,這個(gè)解決方案就顯得更加優(yōu)雅了,既不需要"旗幟"變量,也不需要異常處理或是 for-else 語(yǔ)法以及多余的條件判斷。
函數(shù)的用法在 Python 里是很靈活的,我們可以很容易的創(chuàng)建一個(gè)嵌套函數(shù)或是一個(gè)閉包函數(shù)。如果這個(gè)跳出嵌套循環(huán)的函數(shù)在調(diào)用它的函數(shù)里只使用一次,那么我們可以這樣寫(xiě):
def out_func(): # 這里干點(diǎn)啥 def check_sth(): for i in range(5): for j in range(5): if j == 2 and i == 0: return # 這里干點(diǎn)別的 check_sth() # 執(zhí)行這個(gè)函數(shù) # 這里繼續(xù)干
不過(guò),使用嵌套函數(shù)看起來(lái)并不怎么"優(yōu)雅"。
總結(jié)
這里我們了解了5種跳出嵌套循環(huán)的方法,雖然每種方法都沒(méi)有 PHP 來(lái)的簡(jiǎn)單直接,但我們也是可以實(shí)現(xiàn)這樣的操作地。作為編程人員我們應(yīng)該了解語(yǔ)言的特性,在不同情況下用不同的方法解決問(wèn)題。
到此這篇關(guān)于Python中跳出循環(huán)的兩種方法的文章就介紹到這了,更多相關(guān)Python跳出循環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Pycharm中對(duì)代碼進(jìn)行注釋和縮進(jìn)的方法詳解
今天小編就為大家分享一篇在Pycharm中對(duì)代碼進(jìn)行注釋和縮進(jìn)的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python爬蟲(chóng)基礎(chǔ)之requestes模塊
這篇文章主要介紹了Python爬蟲(chóng)基礎(chǔ)之requestes模塊,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python爬蟲(chóng)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Python iter()函數(shù)用法實(shí)例分析
這篇文章主要介紹了Python iter()函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了Python iter()函數(shù)的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-03-03pandas dataframe rolling移動(dòng)計(jì)算方式
在Pandas中,rolling()方法用于執(zhí)行移動(dòng)窗口計(jì)算,常用于時(shí)間序列數(shù)據(jù)分析,例如,計(jì)算某商品的7天或1個(gè)月銷(xiāo)售總量,可以通過(guò)rolling()輕松實(shí)現(xiàn),該方法的關(guān)鍵參數(shù)包括window(窗口大?。?min_periods(最小計(jì)算周期)2024-09-09python3.0 模擬用戶登錄,三次錯(cuò)誤鎖定的實(shí)例
下面小編就為大家?guī)?lái)一篇python3.0 模擬用戶登錄,三次錯(cuò)誤鎖定的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11利用tkinter改變下拉列表(Combobox)的選項(xiàng)值
這篇文章主要介紹了利用tkinter改變下拉列表(Combobox)的選項(xiàng)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Django項(xiàng)目使用CircleCI的方法示例
這篇文章主要介紹了Django項(xiàng)目使用CircleCI的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python 使用tf-idf算法計(jì)算文檔關(guān)鍵字權(quán)重并生成詞云的方法
這篇文章主要介紹了Python 使用tf-idf算法計(jì)算文檔關(guān)鍵字權(quán)重,并生成詞云,本文通過(guò)實(shí)例代碼給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03在Python中使用xlrd和xlwt讀寫(xiě)Excel文件代碼實(shí)例
這篇文章主要介紹了在Python中使用xlrd和xlwt讀寫(xiě)Excel文件代碼實(shí)例,python操作excel主要用到xlrd和xlwt兩個(gè)庫(kù),即xlrd是讀excel,xlwt是寫(xiě)excel庫(kù),文中提供了部分實(shí)例代碼,需要的朋友可以參考下2023-08-08