由于需要读取文件,并进行匹配,很容易写出三四重循环,但是如何跳出多重循环却成了一个问题
一、.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了 )
二、包装成函数
因为函数的 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