2011-12-07 73 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