2012-12-21 108 views
5
def funcA(i): 
    if i%3==0: 
     print "Oh! No!", 
     print i 
     break 

for i in range(100): 
    funcA(i) 
    print "Pass", 
    print i 

我知道上面的腳本將無法正常工作。那麼,如果我需要使用break或者繼續進入循環,我該怎麼寫呢?休息和繼續功能

回答

11

函數不能在調用它的代碼中導致中斷或繼續。 break/continue必須在循環內逐字顯示。您的選項是:

  1. 回報從FuncA的值,並用它來決定是否打破
  2. 在FuncA的拋出一個異常,並在調用代碼捕獲它(或較高處調用鏈)
  3. 寫一個發電機,它封裝了中斷邏輯和迭代,與其在range

通過#3我的意思是這樣的:

def gen(base): 
    for item in base: 
     if item%3 == 0: 
      break 
     yield i 

for i in gen(range(1, 100)): 
    print "Pass," i 

這使您可以通過將基於「基本」迭代器(在本例中爲範圍)中的生成器組合到生成器中來將該中斷與條件放在一起。然後你遍歷這個生成器,而不是在範圍本身,你會得到破壞行爲。

+1

一個封裝break邏輯的生成器? – ThunderEX

+0

@ThunderEX - 類似於'itertools.takewhile'可能 – eumiro

+0

@ThunderEX:是的,類似於需要。看到我編輯的答案。 – BrenBarn

2
def funcA(i): 
    if i%3==0: 
     print "Oh! No!", 
     print i 
     return True 
    else: 
     return False 

for i in range(100): 
    if funcA(i): 
     break 
    print "Pass", 
    print i 
+0

你可以添加這個代碼是如何回答這個問題的解釋中提到? –

1

中斷不會在函數間傳播,你需要把它直接放在循環的某個地方。

2

詳細描述BrenBarns回答:break幸運的是不會傳播。 break是打破目前的循環,時期。如果你想傳播一個事件,那麼你應該raise一個例外。雖然,提出異常來打破循環是一個非常難看的方式來打破循環和破壞代碼的好方法。

KISS!最簡單的將是直接檢查條件的循環

def my_condition(x): 
    return x == 4 

for i in xrange(100): 
    if my_condition(i): break 
    print i 

如果由於某種原因,你想傳播一個例外,那麼你使用這樣

# exception example 
for i in xrange(100): 
    if i == 4: raise Exception("Die!") 
    print i 

如前所述,它是一個真的很難看設計。想象一下,你忘了捕獲這個異常,或者你從Exception其類型更改爲MyBreakException,卻忘了在代碼try/except較高的部分地方改變它...

發電機例如有其優點,它使你的代碼更functional style (我presonally崇拜)

# generator example 
def conditional_generator(n, condition): 
    for i in xrange(n): 
    if condition(i): 
     break 
    else: 
     yield i 


for i in conditional_generator(100, my_condition): 
    print i 

...這是類似takewhile,由eumiro