2015-04-15 273 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!鸡蛋在我的脸上。这个答案如此迅速地出现在我的脑海中,以至于我撇清了问题的其余部分。抱歉! –