可能重复:
如何在Python中打破多个循环?
是否有一种更容易的方法来打破嵌套循环而不是抛出异常?(在Perl中,您可以为每个循环指定标签,并至少继续外循环.)
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
"break both loops"
Run Code Online (Sandbox Code Playgroud)
也就是说,有一个更好的方式:
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
Run Code Online (Sandbox Code Playgroud)
Mar*_*rot 654
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
Run Code Online (Sandbox Code Playgroud)
同样适用于更深层的循环:
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
Run Code Online (Sandbox Code Playgroud)
Mr *_*ooz 64
如果您能够将循环代码提取到函数中,return则可以使用语句随时退出最外层循环.
def foo():
for x in range(10):
for y in range(10):
print(x*y)
if x*y > 50:
return
foo()
Run Code Online (Sandbox Code Playgroud)
如果很难提取该函数,则可以使用内部函数,如@ 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()
...
Run Code Online (Sandbox Code Playgroud)
Fáb*_*tos 38
使用itertools.product!
from itertools import product
for x, y in product(range(10), range(10)):
#do whatever you want
break
Run Code Online (Sandbox Code Playgroud)
这是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')
]
Run Code Online (Sandbox Code Playgroud)
(格式清晰)
Hal*_*ier 23
有时我使用布尔变量.天真,如果你想,但我发现阅读非常灵活和舒适.测试变量可能会避免再次测试复杂条件,也可能会收集内部循环中多个测试的结果.
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
Run Code Online (Sandbox Code Playgroud)
dbn*_*dbn 17
如果您要引发异常,则可能会引发StopIteration异常.这至少会使意图变得明显.
| 归档时间: |
|
| 查看次数: |
305267 次 |
| 最近记录: |