由于需要讀取檔案,并進行比對,很容易寫出三四重循環,但是如何跳出多重循環卻成了一個問題
一、.for…else
普通的
break
隻能跳出目前循環,即隻能跳出一層循環
for... else
相對比較難了解,而且邏輯看起來比較複雜
for…else:其中else塊中的語句将在 for 循環正常得、完整得執行過之後才會被執行,如果 for 循環被 break ,則 else 塊将不會被執行。
1. 跳出一層循環
dic = {3, 4}
for i in range(0, 5): # 【1】
for j in range(100, 102): # 【2】
for data in dic: # 【3】
if i == data:
print("i:",i)
break # 隻跳出 第【3】重循環
輸出:
i: 3
i: 3
i: 4
i: 4
2. 跳出 2 層循環
dic = {3, 4}
for i in range(0, 5): # 【1】
for j in range(100, 102): # 【2】
for data in dic: # 【3】
if i == data:
print("i:",i)
break # break(1) , 隻跳出 第【3】重循環
else: # else(1)
continue # continue(1)
break # break(2)
輸出:
i: 3
i: 4
解釋:
- 當 if 不成立,即第【3】重 for 的 break(1) 未執行,則執行完第【3】重 for,開始執行 else(1) = > continue(1) => 繼續執行下一輪的 第【2】重 for 循環(break(2) 未執行)
- 當 if 成立,即第【3】重 for 的 break(1) 被執行,則 else(1) 不執行,直接執行 break(2),即跳出 第【2】重 for ,執行下一輪的第【1】重 for。是以輸出 2 個 i。
3. 跳出 3 層循環
dic = {3, 4}
for i in range(0, 5): # 【1】
for j in range(100, 102): # 【2】
for data in dic: # 【3】
if i == data:
print("i:",i)
break # break(1) , 隻跳出 第【3】重循環
else: # else(1)
continue # continue(1)
break # break(2)
else: # else(2)
continue # continue(2)
break # break(3)
輸出:
i: 3
實作了隻要 if 成立,則跳出所有循環
解釋:
break(1) => break(2) => break(3)
三個break 直接跳出所有循環 (其中的 else 均未執行,因為 隻有當for正常執行才會執行 else,一旦 for 被 break了,那麼 else 就不執行,直接直接 else 下一行的 break了 )
二、包裝成函數
def work():
for i in range(10):
for j in range(10):
if i+j > 5:
return i,j
print work()
三、flag 大法好
dic = {3, 4}
flag = False
for i in range(0, 5): # 【1】
for j in range(100, 102): # 【2】
for data in dic: # 【3】
if i == data:
print("i:",i)
flag = True
if flag:
break
if flag:
break
四、抛出異常
class Break(Exception):
pass
try:
for i in range(3):
for j in range(3):
for k in range(3):
print(i, j, k)
if i == j == k == 1:
raise Break('break')
except Break as e:
print(e)
五、笛卡爾積
from itertools import product
for i, j, k in product(range(3), range(3), range(3)):
print(i, j, k)
if i == j == k == 1:
print('break')
break
參考:
- https://www.zhihu.com/question/37076998