我最近阅读了this question,它有一个关于在Java中标记循环的解决方案。在Python中命名循环
我在想Python是否存在这样的循环命名系统。我多次出现在需要从内部for
循环跳出外部for
循环的情况。通常,我通过将内部循环放入一个函数中来解决这个问题,该函数返回(除其他外)一个用作破坏条件的布尔值。但标签循环打破似乎更简单,我想尝试一下,如果这样的功能存在python
有谁知道它是否?
我最近阅读了this question,它有一个关于在Java中标记循环的解决方案。在Python中命名循环
我在想Python是否存在这样的循环命名系统。我多次出现在需要从内部for
循环跳出外部for
循环的情况。通常,我通过将内部循环放入一个函数中来解决这个问题,该函数返回(除其他外)一个用作破坏条件的布尔值。但标签循环打破似乎更简单,我想尝试一下,如果这样的功能存在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
>>>
的称为示例的实施我通过将内环中的功能解决了这个问题,即 返回(等等),其被用作打破 条件一个布尔值。
我想你应该试试这个。这非常pythonic,简单和可读。
+1。对于流量控制使用异常在Python中是非常强大的,尽管它在其他语言中被认为是不好的样式,通常是出于性能原因。 – kindall
如果我只想“继续”外部循环而不是停止它,该怎么办? – Guillochon
@Guillochon只需将try语句放在第一个for循环中 – Dylanthepiguy
这里是打出来使用上下文管理多个嵌套块的方式:
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
检查[第二个答案](http://stackoverflow.com/questions/653509/breaking-out-of-nested-loops),hopefull它有助于一些。但从我所看到的,没有这样的系统存在。 –
“但标记循环打破似乎更简单”?比适当的功能更简单?怎么会这样?你能提供一些证据来证明这将是“更简单”吗? –
我没有一个方便的例子,但这将是一种情况,我将不得不创建一个函数,该函数将仅用于该位置。也许“简单”是错误的词。我的意思是,我不需要定义一个新的功能只是用在那一点上。 – inspectorG4dget