函数中的中断和继续

问题描述 投票:0回答:5
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的函数放入循环中,我该如何编写呢?

python function loops break continue
5个回答
35
投票

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

  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

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


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

如前所述,这是一个“非常丑陋”的设计。想象一下,您忘记捕获此异常,或者将其类型从 Exception 更改为

MyBreakException
并忘记在代码的
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

...与 eumiro 提到的 

takewhile

 类似


1
投票


1
投票


0
投票

def stopIfZero(a): if int(a) == 0: break else: print('Continue') while True: stopIfZero(input('Number: '))

会是这样的:

def stopIfZero(a): if int(a) == 0: return False else: print('Continue') return True while stopIfZero(input('Number: ')): continue

© www.soinside.com 2019 - 2024. All rights reserved.