Python飛び出し多重ループまとめ

15120 ワード

ファイルを読み取り、マッチングする必要があるため、3、4回のループを簡単に書くことができますが、多重ループからどのように飛び出すかが問題になります.
一、for…else
通常のbreakは現在のループからのみ飛び出します.すなわち、1つのループからのみ飛び出します.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)3つのbreakはすべてのループから直接飛び出します(その中のelseはすべて実行されていません.forが正常に実行されてこそelseが実行されるので、forがbreakによって実行されると、elseは実行されず、直接elseの次の行のbreakになります).
    二、関数に包装する
    関数のreturnはすべてのループから直接飛び出すことができるので
    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)
    
    

    五、デカルト積
    この方法の構想は,単一ループから飛び出すことができる以上,多重ループを単一ループに書き換えることであり,これはitertoolsのデカルト積関数product,例えば
    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