【问题标题】:break and continue in function中断并继续功能
【发布时间】:2012-12-08 20:11:56
【问题描述】:
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


    【解决方案1】:

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

    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
    

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

    【讨论】:

    • 一个封装了break逻辑的生成器?
    • @ThunderEX - 可能类似于itertools.takewhile
    • @ThunderEX:是的,类似于 takewhile。请参阅我编辑的答案。
    【解决方案2】:

    详细说明 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】:
      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
      

      【讨论】:

      • 您能否解释一下这段代码如何回答这个问题?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-02-27
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 2019-12-06
        • 2019-12-05
        • 2011-05-11
        相关资源
        最近更新 更多