Python中跳出循環(huán)的兩種方法
我們經(jīng)常遇到循環(huán)在進行到某一個特定的值時,需要跳出循環(huán),或跳過這個值,python中早已為我們準備了這樣的參數(shù):break,continue
比如下面的for循環(huán):
for i in range(1,10): print('循環(huán)了',i,'次')
結(jié)果顯而易見如圖:
當我們想在第三次結(jié)束這個循環(huán)時可以用break這個參數(shù)來跳出循環(huán),代碼如下
for i in range(1,10): if i==3: break else: print('循環(huán)了',i,'次')
這是for循環(huán)就只會進行兩次循環(huán)就會停止,如果如下:
還有一種參數(shù)continue,這個參數(shù)表示的是跳出本次循環(huán),即本次循環(huán)不參與運算,代碼使用如下:
for i in range(1,10): if i==3: continue else: print('循環(huán)了',i,'次')
結(jié)果如下:
當i=3時,循環(huán)是不進行的也就沒有了輸出結(jié)果。
拓展:Python 跳出嵌套循環(huán)的5種方法
很多人說 Python 是給很優(yōu)雅的語言,但凡事都有個弱點,有些時候?qū)τ谀撤N情況,用 Python 實現(xiàn)起來卻不那么"優(yōu)雅"。
例如下面的例子,我們想要跳出這個嵌套循環(huán):
for a in list_a: for b in list_b: if condition(a,b): break
關鍵詞 break 只能跳出這個循環(huán)中的內(nèi)循環(huán)。那有沒有什么方法一次性跳出所有循環(huán)? Python 里有沒有哪個內(nèi)置的關鍵詞可以實現(xiàn)呢?
不幸的的是,沒有。
有句老話講的好,"沒有對比就沒有傷害", Python 做不到,其它的語言卻可以,比如萬人鄙視的 PHP:
foreach ($a_list as $a) { foreach ($b_list as $b) { if (condition($a, $b)) { break 2; // 跳出兩次循環(huán) } } }
在 PHP 里 break 關鍵詞后面跟著一個數(shù)組,表示要跳出循環(huán)的次數(shù),默認值是1,表示跳出一次循環(huán)。
這是一個很簡潔命令的解決方案,這里必須夸一句 PHP,這里它表現(xiàn)的不錯。
不過 Python 畢竟是很靈活的語言,我們有很多方法可以解決上面的問題,下面我就介紹 5 中跳出嵌套循環(huán)的方法。
1. 使用"旗幟"變量
這是個有效的解決方案,我們定義一個變量,作為一個"旗幟",例如:
# 添加"旗幟"變量 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 作為一個"旗手"告訴這個程序該跳出這個外循環(huán)了。
這個代碼在執(zhí)行上沒什么問題,不過這顯得我們的代碼有點亂,因為我們引用了新的變量去解決這個問題,這個新變量并非非要引入的。
2. 引發(fā)異常
如果 break 關鍵詞不能達到我們的期望,那么是否可以引入其他的操作呢,比如 Python 的異常處理技術,我們可以使用它跳出嵌套循環(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"當做關鍵詞 break 使用,這樣就可以一次跳出所有循環(huán)。
3. 使用相同的條件語句
由于一個條件語句可以中斷一次循環(huán),那么使用相同的條件語句同樣也可以再一次中斷一個循環(huán),例如:
# 使用相同的條件語句 for i in range(5): for j in range(5): if j == 2 and i == 0: break if j == 2 and i == 0: break
上面的代碼可行,但并不是一個好的解決方案,至少在效率上很差,因為重復執(zhí)行一個條件語句會浪費很多時間。
4. 使用 For-Else 語句
Python 里有一個很特殊的語句:"for-else"。 它并不流行以至于很少有人知道它,因為習慣上 else 是搭配 if 來使用。
不過對于這個問題,它卻是很有幫助:
# 使用 For-Else 語句 for i in range(5): for j in range(5): if j == 2 and i == 0: break else: # 僅在內(nèi)循環(huán)不中斷時執(zhí)行 continue break
上面的代碼中顯示了 for-else 語句的優(yōu)勢,因為 else 下面的語句只有當內(nèi)循環(huán)執(zhí)行完成并沒有任何中斷的時候才執(zhí)行。
如果對 for-else 還不熟悉,可以看一下下面的代碼,是 for-else "翻譯"過來的寫法:
# 和 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
總之,這個方法很可以,就是 for-else 這種形式不好理解。
5. 將嵌套循環(huán)放在一個函數(shù)里
如果我們將嵌套循環(huán)放在一個函數(shù)中,那么跳出嵌套循環(huán)是非常簡單的,因為我們可以使用 return 這個關鍵詞替代 break 。
# 將嵌套循環(huán)放在一個函數(shù)里 def check_sth(): for i in range(5): for j in range(5): if j == 2 and i == 0: return check_sth() # 執(zhí)行這個函數(shù)
如上所示,這個解決方案就顯得更加優(yōu)雅了,既不需要"旗幟"變量,也不需要異常處理或是 for-else 語法以及多余的條件判斷。
函數(shù)的用法在 Python 里是很靈活的,我們可以很容易的創(chuàng)建一個嵌套函數(shù)或是一個閉包函數(shù)。如果這個跳出嵌套循環(huán)的函數(shù)在調(diào)用它的函數(shù)里只使用一次,那么我們可以這樣寫:
def out_func(): # 這里干點啥 def check_sth(): for i in range(5): for j in range(5): if j == 2 and i == 0: return # 這里干點別的 check_sth() # 執(zhí)行這個函數(shù) # 這里繼續(xù)干
不過,使用嵌套函數(shù)看起來并不怎么"優(yōu)雅"。
總結(jié)
這里我們了解了5種跳出嵌套循環(huán)的方法,雖然每種方法都沒有 PHP 來的簡單直接,但我們也是可以實現(xiàn)這樣的操作地。作為編程人員我們應該了解語言的特性,在不同情況下用不同的方法解決問題。
到此這篇關于Python中跳出循環(huán)的兩種方法的文章就介紹到這了,更多相關Python跳出循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pandas dataframe rolling移動計算方式
在Pandas中,rolling()方法用于執(zhí)行移動窗口計算,常用于時間序列數(shù)據(jù)分析,例如,計算某商品的7天或1個月銷售總量,可以通過rolling()輕松實現(xiàn),該方法的關鍵參數(shù)包括window(窗口大?。?min_periods(最小計算周期)2024-09-09Python 使用tf-idf算法計算文檔關鍵字權重并生成詞云的方法
這篇文章主要介紹了Python 使用tf-idf算法計算文檔關鍵字權重,并生成詞云,本文通過實例代碼給大家介紹的非常想詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03在Python中使用xlrd和xlwt讀寫Excel文件代碼實例
這篇文章主要介紹了在Python中使用xlrd和xlwt讀寫Excel文件代碼實例,python操作excel主要用到xlrd和xlwt兩個庫,即xlrd是讀excel,xlwt是寫excel庫,文中提供了部分實例代碼,需要的朋友可以參考下2023-08-08