跳出嵌套循环[重复]
- 2025-01-08 08:50:00
- admin 原创
- 207
问题描述:
有没有比抛出异常更容易的方法来跳出嵌套循环?(在Perl中,你可以为每个循环添加标签,并且至少继续执行外层循环。)
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
"break both loops"
即,有没有比以下更好的方法:
class BreakIt(Exception): pass
try:
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
raise BreakIt
except BreakIt:
pass
解决方案 1:
for x in range(10):
for y in range(10):
print(x * y)
if x * y > 50:
break
else:
continue # only executed if the inner loop did NOT break
break # only executed if the inner loop DID break
对于更深的循环也是同样的道理:
for x in range(10):
for y in range(10):
for z in range(10):
print(x, y, z)
if (x * y * z) == 30:
break
else:
continue
break
else:
continue
break
解决方案 2:
至少有人提出过这个建议,但也被拒绝了。我认为除了重复测试或重新组织代码外,没有其他办法了。有时这有点烦人。
在拒绝信息中,van Rossum 先生提到使用return
,这确实很明智,我个人需要记住。:)
解决方案 3:
如果您能够将循环代码提取到函数中,return
则可以使用语句随时退出最外层循环。
def foo():
for x in range(10):
for y in range(10):
print(x*y)
if x*y > 50:
return
foo()
如果很难提取该函数,您可以使用内部函数,如@bjd2385 建议的那样,例如
def your_outer_func():
...
def inner_func():
for x in range(10):
for y in range(10):
print(x*y)
if x*y > 50:
return
inner_func()
...
解决方案 4:
使用 itertools.product!
from itertools import product
for x, y in product(range(10), range(10)):
#do whatever you want
break
这是 Python 文档中 itertools.product 的链接:
http: //docs.python.org/library/itertools.html#itertools.product
您还可以循环遍历包含 2 个 for 的数组推导,并在需要时随时中断。
>>> [(x, y) for y in ['y1', 'y2'] for x in ['x1', 'x2']]
[
('x1', 'y1'), ('x2', 'y1'),
('x1', 'y2'), ('x2', 'y2')
]
解决方案 5:
有时我会使用布尔变量。如果你愿意的话,这很幼稚,但我发现它非常灵活且易于阅读。测试变量可以避免再次测试复杂的条件,也可以收集内部循环中多个测试的结果。
x_loop_must_break = False
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
x_loop_must_break = True
break
if x_loop_must_break: break
解决方案 6:
如果你要抛出异常,你可以抛出StopIteration 异常。这至少可以让意图变得明显。
解决方案 7:
您还可以重构代码以使用生成器。但这可能不是解决所有类型嵌套循环的解决方案。
解决方案 8:
在这种特殊情况下,您可以使用 itertools.product 将循环与现代 python(3.0 以及可能的 2.6)合并。
我自己将此作为一条经验法则,如果嵌套了太多循环(例如,超过 2 个),通常能够将其中一个循环提取到不同的方法中或将循环合并为一个,就像在这种情况下一样。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD