我最近阅读了这个问题,其中有一个关于在Java中标记循环的解决方案。
我想知道是否存在这样的循环命名系统可以在Python中使用。我多次遇到这种情况,需要从内部for
循环中跳出外部for
循环。通常,我通过将内部循环放入返回布尔值(以及其他内容)的函数中来解决此问题,该布尔值用作跳出条件。但是,为了跳出循环而标记循环似乎更简单,如果Python中存在这样的功能,我想尝试一下。
有人知道它是否存在吗?
以下是使用上下文管理器来打破多个嵌套块的一种方法:
import contextlib
@contextlib.contextmanager
def escapable():
class Escape(RuntimeError): pass
class Unblock(object):
def escape(self):
raise Escape()
try:
yield Unblock()
except Escape:
pass
with escapable() as a:
for i in xrange(30):
for j in xrange(30):
if i * j > 6:
a.escape()
甚至可以嵌套使用:
with escapable() as a:
for i in xrange(30):
with escapable() as b:
for j in xrange(30):
if i * j == 12:
b.escape() # Break partway out
if i * j == 40:
a.escape() # Break all the way out
break 2
(php)或者continue loop1;
(javascript)相比,这样做确实更易读。此外,这个充斥着缩进问题的代码真的很符合Python风格吗?使用raise StopIteration
似乎是最干净、最易读、最符合Python风格的解决方案。 - Stof虽然在语言结构中包含命名循环的原因是存在的,但你可以在Python中轻松避免使用它而不影响可读性。 一个在Python中实现的相关示例:
>>> try:
for i in xrange(0,5):
for j in xrange(0,6):
if i*j > 6:
print "Breaking"
raise StopIteration
print i," ",j
except StopIteration:
print "Done"
0 0
0 1
0 2
0 3
0 4
0 5
1 0
1 1
1 2
1 3
1 4
1 5
2 0
2 1
2 2
2 3
Breaking
Done
>>>
我通过将内部循环放入一个函数中解决了这个问题,该函数返回(其中包括)一个布尔值作为跳出条件。
我认为你应该尝试这种方法。这非常符合Python语言的风格,简单易读。
不行。
根据您正在做的事情,使用itertools中的某些内容将嵌套的for循环展开为单个for循环的可能性很大。
break
怎么样? - S.Lott