天天看點

Python 跳出多重循環總結

由于需要讀取檔案,并進行比對,很容易寫出三四重循環,但是如何跳出多重循環卻成了一個問題

一、.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      

解釋:

  1. 當 if 不成立,即第【3】重 for 的 break(1) 未執行,則執行完第【3】重 for,開始執行 else(1) = > continue(1) => 繼續執行下一輪的 第【2】重 for 循環(break(2) 未執行)
  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      
參考:
  1. ​​https://www.zhihu.com/question/37076998​​