2015-04-15 468 views
0

根據調用函數後獲得的結果,我需要跳出for循環。這是我後一個例子(沒有明顯工作):Python:跳出for循環調用函數

def break_out(i): 
    # Some condition 
    if i > 10: 
     # This does not work. 
     return break 

for i in range(1000): 
    # Call function 
    break_out(i) 

當然,這是一個很簡單MWE,我的實際作用要大得多這就是爲什麼我移動它的外for循環。

This answer說這是不可能的,我應該使該函數返回一個布爾值並在for循環內添加一個if語句來決定。由於這是一個相當古老的問題,並沒有得到太多的關注(也適用於while循環),我想重新檢查是否有可能這樣的事情。

+1

爲什麼鏈接的答案不適合? – SiHa

+0

@SiHa我沒有說它不適合,我問是否有更多的_direct_這樣做(而不是返回一個標誌,並添加一個「if」塊)。 – Gabriel

+1

不,沒有新的做法 - 前面的問題仍然適用 – jonrsharpe

回答

5

不,它不是(合理的)可能的。我想你可以提出一個例外,但是你必須在循環之外用語句try/except來捕捉它。

由於OP已經表達了對此的好奇心,因此我將解釋爲什麼 Python不允許你這樣做。函數應該是composable元素。他們打算在不同的環境下工作。

允許一個函數來跳出循環有兩個不同的問題:

  1. 客戶端代碼可能不希望這種行爲。
  2. 如果沒有循環會怎麼樣?

對於(1),如果我讀像這樣的代碼:

import foo # some library I didn't write 

while condition: 
    foo.bar() 
assert not condition 

我合理地假設斷言將不會觸發。但如果foo.bar()能夠擺脫循環,它可以。

對於(2),也許我寫了這個其他地方:

if condition: 
    foo.bar() 

目前還不清楚是什麼應該做的,如果foo.bar()嘗試打破循環,因爲沒有循環。

+0

爲什麼不添加一個try/except _inside_循環?然後在除了休息? – logic

+0

@logic:'if'的輸入較少。 – Kevin

+0

確實如此,引發錯誤是一個不好的方法。 – logic

1

而不是return break,返回一個強制中斷條件的值。擴展您的示例:

def break_out(i): 
    # Some condition 
    return i > 10 # Returns `True` if you should break from loop. 


for i in range(1000): 
    # Call function 
    if break_out(i): 
     break 

    # Insert the rest of your code here... 
+1

是的,這是OP在他的問題中提到的內容,並詢問它是否可以做不同的處理。 – fedorqui

+1

是的,這就是我試圖避免的(也就是說,問題的答案几乎完全相關)謝謝! – Gabriel

+1

Ack!雞蛋在我的臉上。這個答案如此迅速地出現在我的腦海中,以至於我撇清了問題的其餘部分。抱歉! –