打破了嵌套循环
可能重复:
如何摆脱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),你通常能够提取一个循环到另一个方法或合并成一个循环,就像这个案件。