中断并继续功能

break and continue in function

提问人:ThunderEX 提问时间:12/21/2012 最后编辑:Martijn PietersThunderEX 更新时间:12/21/2012 访问量:70194

问:

def funcA(i):
   if i%3==0:
      print "Oh! No!",
      print i
      break

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

我知道上面的脚本不起作用。那么,如果我需要将一个带有中断或继续的函数放入循环中,我该如何编写呢?

python 函数 循环 中断 继续

评论


答:

1赞 eumiro 12/21/2012 #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

评论

2赞 5/18/2016
您能否解释一下此代码如何回答该问题?
1赞 LtWorf 12/21/2012 #2

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

35赞 BrenBarn 12/21/2012 #3

函数不能在调用它的代码中导致中断或继续。中断/继续必须从字面上出现在循环中。您的选项包括:

  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赞 ThunderEX 12/21/2012
封装中断逻辑的生成器?
0赞 eumiro 12/21/2012
@ThunderEX - 类似的东西itertools.takewhile
0赞 BrenBarn 12/21/2012
@ThunderEX:是的,类似于takewhile。请参阅我编辑的答案。
3赞 Jakub M. 12/21/2012 #4

详细阐述 BrenBarns 的答案:幸运的是不会传播。 就是打破电流循环,周期。如果要传播事件,则应出现异常。虽然,引发异常来破坏循环是一种非常丑陋的破坏循环的方式,也是一种打破代码的好方法。breakbreakraise

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

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

如前所述,这是一个非常丑陋的设计。想象一下,您忘记捕获此异常,或者将其类型从 更改为 并忘记在代码较高部分的某个位置更改它......ExceptionMyBreakExceptiontry/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

...这类似于 Eumiro 提到的 TakeWhile