由于需要读取文件,并进行匹配,很容易写出三四重循环,但是如何跳出多重循环却成了一个问题

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

二、包装成函数

因为函数的 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

参考:
  1. https://www.zhihu.com/question/37076998