【问题标题】:Opposite of Python for ... elsePython for ... else 的对面
【发布时间】:2011-03-18 18:50:32
【问题描述】:

以下 Python 代码将打印 n (14),因为 for 循环已完成。

for n in range(15):
    if n == 100:
        break
else:
    print(n)

但是,我想要与此相反。有没有办法做一个 for ... else(或 while ... else)循环,但只执行 else 代码 if循环是否中断了?

【问题讨论】:

  • 太累了,无法编写解决方案 atm(可能稍后!),但使用 contextmanagers 可能是一个解决方案!灵感来源可能在这里:stackoverflow.com/a/3171971/1524913

标签: python python-3.x for-loop if-statement


【解决方案1】:

在 Python(或任何我知道的语言)中没有明确的 for...elseifbreak-like 构造,因为您可以简单地这样做:

for n in range(15): 
    if n == 100:
        print(n)  
        break

如果您有多个breaks,请将print(n) 放入一个函数中,这样您就可以Don't Repeat Yourself

【讨论】:

  • 肯定不是操作想要的?
  • 为什么不呢?它具有相同的效果。如果您希望代码在遇到break 语句时运行,那么只需...在 break 语句之前运行代码
  • 我还没有见过这样的结构,但你总是可以使用 *shudders* goto
  • 关键是 OP 想要的并不是他真正想要的,有更好的方法来做到这一点。
【解决方案2】:

使用异常的更通用的解决方案,以防您在循环中的多个点中断并且不想重复代码:

try:
    for n in range(15):
        if n == 10:
            n = 1200
            raise StopIteration()
        if n > 4:
            n = 1400
            raise StopIteration()
except StopIteration:
    print n

【讨论】:

    【解决方案3】:

    到目前为止,我不太喜欢发布的答案,因为它们都需要更改循环的主体,如果主体真的很复杂,这可能会很烦人/有风险,所以这里有一种方法可以使用一只旗。将 _break 替换为 found 或其他对您的用例有意义的内容。

    _break = True
    for n in range(15):
        if n == 100:
            break
    else:
        _break = False
    
    if _break:
        print(n)
    

    另一种可能性,如果它是一个在循环未找到匹配项时不执行任何操作的函数,是 else: 块中的 return

    for n in range(15):
        if n == 100:
            break
    else:
        return
    print(n)
    

    【讨论】:

      【解决方案4】:

      用途:

      for n in range(15):
          if n == 100:
              break
      else:
          print("loop successful")
      if n != range(15)[-1]:
          print("loop failed")
      

      【讨论】:

      • 如果break 发生在最后一个循环迭代中,则会给出错误的结果。在这种情况下,它将打印both“循环成功”和“循环失败”。
      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      • 您好!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 2016-10-28
      • 2013-08-30
      • 2015-03-02
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多