19
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 或 continue 的函数放入循环中,我该如何编写?

4

4 回答 4

31

函数不能在调用它的代码中导致中断或继续。中断/继续必须逐字出现在循环内。您的选择是:

  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

这允许您通过将它们分组到基于“基本”迭代器(在本例中为范围)的生成器中来放置条件中断。然后你迭代这个生成器而不是范围本身,你就会得到破坏行为。

于 2012-12-21T08:52:17.197 回答
3

阐述 BrenBarns 的答案:break 幸运的是不会传播。break是打破当前循环,周期。如果你想传播一个事件,那么你应该raise例外。虽然,引发异常以打破循环是一种非常丑陋的打破循环的方式,也是一种打破代码的好方法。

!最简单的方法是直接在循环中检查条件

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

如前所述,这是一个非常丑陋的设计。想象一下,您忘记捕获此异常,或者您将其类型从ExceptiontoMyBreakException更改为并忘记try/except在代码的较高部分更改它...

生成器示例有其优点,它使您的代码更具功能性(我个人很喜欢)

# 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

...类似于takewhileeumiro 提到的

于 2012-12-21T09:18:45.930 回答
1
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
于 2012-12-21T08:51:02.563 回答
1

Break 不会在函数之间传播,您需要将其直接放在循环中的某个地方。

于 2012-12-21T08:51:33.147 回答