中断并继续运行

2024-05-15 21:33:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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放入一个循环中,该如何编写呢?


Tags: 函数noinforifdefrangepass
3条回答

解释布伦巴恩斯的答案: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

……类似于欧米罗提到的^{}

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

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

我的意思是这样的:

def gen(base):
    for item in base:
        if item%3 == 0:
           break
        yield i

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

这允许您通过基于“base”迭代器(在本例中是一个范围)将条件分组到一个生成器中,从而使条件中断。然后在这个生成器上迭代,而不是在范围本身上迭代,得到断开行为。

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

相关问题 更多 >