2011-12-07 75 views
12

我最近阅读了this question,它有一个关于在Java中标记循环的解决方案。在Python中命名循环

我在想Python是否存在这样的循环命名系统。我多次出现在需要从内部for循环跳出外部for循环的情况。通常,我通过将内部循环放入一个函数中来解决这个问题,该函数返回(除其他外)一个用作破坏条件的布尔值。但标签循环打破似乎更简单,我想尝试一下,如果这样的功能存在python

有谁知道它是否?

+0

检查[第二个答案](http://stackoverflow.com/questions/653509/breaking-out-of-nested-loops),hopefull它有助于一些。但从我所看到的,没有这样的系统存在。 –

+0

“但标记循环打破似乎更简单”?比适当的功能更简单?怎么会这样?你能提供一些证据来证明这将是“更简单”吗? –

+1

我没有一个方便的例子,但这将是一种情况,我将不得不创建一个函数,该函数将仅用于该位置。也许“简单”是错误的词。我的意思是,我不需要定义一个新的功能只是用在那一点上。 – inspectorG4dget

回答

9

有人建议在python PEP3136中包含命名循环,但是,它被拒绝并解释here。拒绝主要是由于罕见的情况下代码可读性将通过包含此构造而得到改进。

1

没有。

根据你正在做的事情,你可以使用itertools中的某些东西将你嵌套的for循环平化为一个for循环。

8

虽然有理由在语言构造中包含命名循环语句,但您可以很容易地避免使用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,简单和可读。

+2

+1。对于流量控制使用异常在Python中是非常强大的,尽管它在其他语言中被认为是不好的样式,通常是出于性能原因。 – kindall

+2

如果我只想“继续”外部循环而不是停止它,该怎么办? – Guillochon

+1

@Guillochon只需将try语句放在第一个for循环中 – Dylanthepiguy

6

这里是打出来使用上下文管理多个嵌套块的方式:

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