打破了嵌套循环

可能重复:
如何摆脱Python中的多个循环?

有没有更容易的方法来打破嵌套循环比抛出exception? (在Perl中,您可以为每个循环提供标签,并至less继续一个外部循环。)

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 

至less有人build议,但也被拒绝 。 我不认为有另一种方式,重复testing或重新组织代码。 有时候有点烦人

van Rossum先生在拒绝的信息中提到了使用return ,这是非常合理的,我个人需要记住的东西。 🙂

 for x in xrange(10): for y in xrange(10): print x*y if x*y > 50: break else: continue # executed if the loop ended normally (no break) break # executed if 'continue' was skipped (break) 

同样的作品更深的循环:

 for x in xrange(10): for y in xrange(10): for z in xrange(10): print x,y,z if x*y*z == 30: break else: continue break else: continue break 

如果您能够将循环代码提取到函数中,则可以使用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() ... 

使用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

有时我使用布尔variables。 天真,如果你想,但我觉得它非常灵活,舒适的阅读。 testing一个variables可能会避免再次testing复杂的条件,也可能从内部循环中的多个testing中收集结果。

  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 

如果您要引发exception,您可能会引发StopIterationexception 。 这至less会使意图变得明显。

你也可以重构你的代码来使用一个生成器。 但是这可能不是所有types的嵌套循环的解决scheme。

在这种情况下,你可以使用itertools.product将循环与现代python(3.0,也可能是2.6)合并。

我自己把这个作为一个经验法则,如果你嵌套太多的循环(如in,超过2),你通常能够提取一个循环到另一个方法或合并成一个循环,就像这个案件。