【问题标题】:Flow control after breaking out of while loop in Python在 Python 中跳出 while 循环后的流控制
【发布时间】:2013-05-28 22:54:10
【问题描述】:

我对编程和 Python 都很陌生。现在有几次,我创建了一个感觉很尴尬的程序流程,我想知道我是否遵循了最佳实践。这在概念上是我想做的:

def pseudocode():
    while some condition is true:
        do some stuff
        if a condition is met:
            break out of the while loop
    now do a thing once, but only if you never broke out of the loop above 

我最终做了什么,但不知何故感觉不对:

def pseudocode():
    while some condition is true:
        do some stuff
        if some condition is met:
            some_condition_met = True
            break out of the while loop

    if some_condition_met is False:
        do a thing

有没有更好的办法?

【问题讨论】:

    标签: python while-loop flow


    【解决方案1】:

    你正在寻找while-else循环:

    def pseudocode():
        while some condition is true:
            do some stuff
            if a condition is met:
                break out of the while loop
        else:
            now do a thing once, but only if you never broke out of the loop above 
    

    来自文档:

    while_stmt ::=  "while" expression ":" suite
                    ["else" ":" suite]
    

    在第一个套件中执行的break 语句终止循环 不执行else 子句的套件。

    【讨论】:

    • 哇,现在不存在(显然!)。谢谢。
    【解决方案2】:

    while 循环中使用else 子句:

    while some_condition:
        do_stuff()
        if a_condition_is_met:
            break
    else:
        executed_when_never_broken
    

    while statement documentation

    在第一个套件中执行的 break 语句终止循环,而不执行 else 子句的套件。

    【讨论】:

      【解决方案3】:

      如果您考虑一下,您可能已经有了一个非常好的条件来使用而无需设置标志:while 循环顶部的条件(或者更确切地说,它的 not)。假设您没有在与break 相同的迭代期间更改您的条件的真实性,这将为您提供:

      while something:
          do_stuff()
          if something_else:
              break
      if not something:
         more_stuff()
      

      如果您将while 视为重复的if,这是有道理的:不是发生一次,而是一段时间继续进行,直到条件变为错误。

      但是,就像其他答案提到的那样,这个类比更进一步:就像您不必将所有 ifs 拼写为

      if a:
          a_stuff()
      if not a:
          b_stuff()
      

      while 接受else,如果测试顶部的条件并发现其为假,则执行该else。所以,

      while something:
          do_stuff()
          if something_else:
             break
      else:
          more_stuff()
      

      并且,与if/else 的情况相同,这并不意味着对条件进行任何进一步的测试,而不是无论如何都会发生的情况。与附加到if aelse 相同,如果真分支使a 为假,则附加到elseelse 将永远不会在break 之后运行,因为这是明确的跳过再次检查条件。这使得else: 在每种情况下都相当于一个decicated 标志。

      这也延伸到for 循环,即使类比中断了——但它在足够相似的规则下执行:如果循环以运行其路线结束而不是碰到break 结束,则运行else

      【讨论】:

      • 请注意,else: 子句和 if not something 测试可能略有不同。如果在循环期间while 循环条件变为False并且您在同一迭代期间使用break,则else: 套件将不会执行,但您的if 套件将执行。
      • @MartijnPieters 非常正确。我已经编辑了答案以说明这一点。
      猜你喜欢
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多