它至少被建议,但也被拒绝.我不认为还有另一种方法,没有重复测试或重新组织代码.有时候有点烦人.
在拒绝消息中,van Rossum先生提到使用return
,这是非常明智的,我需要亲自记住.:)
for x in xrange(10): for y in xrange(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 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
它至少被建议,但也被拒绝.我不认为还有另一种方法,没有重复测试或重新组织代码.有时候有点烦人.
在拒绝消息中,van Rossum先生提到使用return
,这是非常明智的,我需要亲自记住.:)
如果您能够将循环代码提取到函数中,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
你也可以用2个fors循环数组理解,并随时打破.
>>> [(x, y) for y in ['y1', 'y2'] for x in ['x1', 'x2']] [ ('x1', 'y1'), ('x2', 'y1'), ('x1', 'y2'), ('x2', 'y2') ]
(格式清晰)
有时我使用布尔变量.天真,如果你想,但我发现阅读非常灵活和舒适.测试变量可能会避免再次测试复杂条件,也可能会收集内部循环中多个测试的结果.
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
如果您要引发异常,则可能会引发StopIteration异常.这至少会使意图变得明显.
您还可以重构代码以使用生成器.但这可能不是所有类型的嵌套循环的解决方案.