for a in range(10):
for b in range(20):
if something(a, b):
# Break the inner loop...
break
经常会碰到两层甚至多层循环的情况,很多时候需要跳出内层循环到最外面。但是break只能跳出一层循环。
虽然goto被广为诟病,但是不得不说这是跳出多层循环的一种法子。然而python自带的没有goto语句。。。碰到了N次之后总结了几种跳出多层循环的方法:
方法一:利用函数
def work(): #定义函数
for i in range(5):
print("i=", i)
for j in range(5):
print("--j=", j)
for k in range(5):
if k==2:
return i,j,k
print (work())
return是直接返回的,也算是一种变相跳出多层循环的法子,把多层循环封装成函数。
方法二:立flag
break_flag=False
for i in range(10):
print("grandfather")
for j in range(10):
print("father")
for k in range(10):
print("son")
if k==3:
break_flag=True
break #跳出孙子层循环,继续向下运行
if break_flag==True:
break #满足条件,运行break跳出爸爸层循环,向下运行
if break_flag==True:
break #满足条件,运行break跳出爷爷层循环,结束全部循环,向下运行
print("keep going...")
不得不说这样代码太臃肿了,而且如果逻辑稍微复杂一些,可能会需要不只一个flag,反正个人是不喜欢这种法子。
PS:百度到的某些博客上说的利用while循环,本质上也是立flag,而且多层for改成多层while也是很考验逻辑的,个人不推荐。
方法三:for...else
不知道是不是python独有的语法,for循环执行完毕,才执行else语句,若for循环中途被break,else语句不执行
所以可以利用这一点跳出多层循环:
for i in range(10):
for j in range(10):
Something():#内层循环要执行的操作
break
else:
continue #如果内层for循环正常执行完毕,continue
break
关于for...else的用法,参考:https://www.cnblogs.com/dspace/p/6622799.html
方法四:goto模块
你没看错,python真的有goto模块,大概是广为诟病的goto还是有那么点用的吧
from goto import with_goto
@with_goto
def range(start, stop):
for i in range(10):
for j in range(10):
something()
if j == stop;
goto .end;
label .end
方法五:自定义异常
classFound(Exception):pass
try:for i in range(10):for j in range(i): #第二重循环跟第一重有关
if i + j > 5:raiseFoundexceptFound:print i, j
老实说这种方法第一次看到我也被震惊到了。还有这种操作...
更多奇技淫巧,详见 https://spaces.ac.cn/archives/4159