Python中的命名循环
我最近读了一篇关于Java中标记循环的解决方案的文章Python中的命名循环,python,for-loop,label,break,Python,For Loop,Label,Break,我最近读了一篇关于Java中标记循环的解决方案的文章 我想知道Python中是否存在这样的循环命名系统。我曾多次遇到这样的情况:我确实需要从内部for循环中突破外部for循环。通常,我通过将内部循环放在一个函数中来解决这个问题,该函数返回(除其他外)一个用作中断条件的布尔值。但是为中断循环添加标签似乎要简单得多,如果python中存在这样的功能,我想尝试一下 >>> try: for i in xrange(0,5): for j in xrange(0
我想知道Python中是否存在这样的循环命名系统。我曾多次遇到这样的情况:我确实需要从内部
for
循环中突破外部for
循环。通常,我通过将内部循环放在一个函数中来解决这个问题,该函数返回(除其他外)一个用作中断条件的布尔值。但是为中断循环添加标签似乎要简单得多,如果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循环 尽管在语言构造中包含命名循环是有原因的,但在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的,简单易读 以下是使用上下文管理器打破多个嵌套块的方法:
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
检查一下,希望对你有所帮助。但从我所看到的情况来看,没有这样的系统存在。“但是给断开的循环贴上标签似乎要简单得多”?比适当的函数更简单?为什么呢你能提供一些证据证明这是如何“简单”的吗?我手头没有一个例子,但在这种情况下,我必须创建一个只在这一点上使用的函数。也许“更简单”是个错误的词。我的意思是,我不必定义一个新函数,只为在那个地方使用。嵌套函数定义有什么错?另外,如何重新设计内部循环以避免
中断
?我只是不喜欢它们。我想这是个人喜好+1。在Python中,将异常用于流控制是非常简单的,尽管在其他语言中,通常出于性能原因,它被认为是不好的风格。如果我只是想“继续”外部循环,而不是停止它,该怎么办?@Guillochon只是将try语句放在第一个for循环中