【问题标题】:Python 3 how does the 'else' work in this loop [duplicate]Python 3'else'如何在这个循环中工作[重复]
【发布时间】:2020-03-05 13:58:09
【问题描述】:

这段代码生成排列,我对最后的else: return 的工作原理感兴趣。

all_str = []
def permu(iterable,r=None):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = list(range(n))
    cycles = list(range(n, n - r, -1))
    all_str.append( tuple(pool[i] for i in indices[:r]))
    while True:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i + 1:] + indices[i:i + 1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                all_str.append( tuple(pool[i] for i in indices[:r]))
                break
        else: # here
            return
permu("abcde",4)

底部的else 指的是什么?我知道您可以在循环中使用if,在循环外使用else,但这似乎并非如此,因为if 已经由else 处理。

当我删除 else: return 时,该函数会以重复的方式无休止地生成排列。

我想知道这一点,因为我需要在 C++ 中复制这段代码。

任何帮助或建议将不胜感激:)

【问题讨论】:

  • 将“for else”读作“for finally”更清楚。如果 for 循环正确完成,则执行 else。 read more。在您的示例中,它将在 for 完成后返回(退出 while)。
  • @Raphael 是的!谢谢!

标签: python loops if-statement permutation


【解决方案1】:

for 循环的else 子句在特殊情况下运行:如果循环结束而没有任何中断(在这种情况下:break),else 子句将运行,否则将被跳过。 即如果与if相关的else被执行,则forelse不会运行。

【讨论】:

    【解决方案2】:

    如果没有人从 for 循环中显式执行 break,则执行 for 循环的 else 语句 (python文档中的完整解释https://docs.python.org/3.6/reference/compound_stmts.html#the-for-statement

    所以如果你想在 C++ 中复制它 您必须设置一个变量来跟踪您是通过 break 退出 for 循环还是仅仅因为 for 循环完成而退出。

    我很久没有写过 C 了,所以我的伪 C 代码中可能会有一些小错误。

    while(bla){
      int encountered_break = 0;
      for(bla;bla;bla){
          if (bla){
          } else {
              encountered_break = 1;
              break;
          }
      }
      if(!encountered_break){
          return;
      }
    }
    

    【讨论】:

    • 修复了之前评论中的一些错误(现在被删除为错误和多余的):@Raphael 你有没有break 的代码示例,它不会调用else for 循环的部分?在 for 循环中导致异常的示例只会引发正常异常,因此else: 和异常执行后的任何代码都不会。此外,在阅读了 for 循环 (docs.python.org/3.6/reference/…) 的文档后,我不知道如何进入 else 部分,除非使用 break
    • 奇怪:每当我投票失败时,我从来没有得到解释(这将帮助我提高答案的质量)添加了指向 for 循环完整文档的链接,以防这是原因.
    【解决方案3】:

    for else 读作for finally 更清楚。如果for loop 正确完成,则执行else。在您的示例中,它将在 for loop 完成后返回(退出 while)。

    在您的示例中,如果您删除 else: return,则执行将始终在 while True 内。

    阅读更多相关信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多