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了 )

二、包装成函数

因为函数的 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
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值