打破并继续运作

时间:2012-12-21 08:48:43

标签: python function loops break continue

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或继续循环,我怎么写?

4 个答案:

答案 0 :(得分:14)

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

  1. 从funcA返回一个值并使用它来决定是否中断
  2. 在funcA中引发异常并在调用代码中捕获它(或在调用链的上方某处)
  3. 编写一个封装中断逻辑的生成器,并在range
  4. 上迭代它

    #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 :(得分: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

答案 2 :(得分:2)

Elaborating 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(我以前崇拜)

# 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

...与eumiro提到的takewhile相似

答案 3 :(得分:1)

Break不会在函数之间传播,你需要将它直接放在某个循环中。