首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何理解Python循环中的‘`else`’子句?

如何理解Python循环中的‘`else`’子句?
EN

Stack Overflow用户
提问于 2016-06-05 21:41:04
回答 12查看 13.6K关注 0票数 189

许多Python程序员可能没有意识到while循环和for循环的语法包括一个可选的else:子句:

for val in iterable:
    do_something(val)
else:
    clean_up()

对于某些类型的清理操作,else子句的主体是一个很好的位置,并在循环正常终止时执行:即,使用returnbreak退出循环会跳过else子句;在continue执行它之后退出。我之所以知道这一点,只是因为我刚刚(再次)执行了looked it up,因为我永远记不住else子句是什么时候执行的。

总是这样吗?循环的“失败”,顾名思义?关于常规终止?即使循环是用return退出的?如果不查一查,我永远不能完全确定。

我将我持久的不确定性归咎于关键字的选择:我发现else对于这种语义来说是令人难以置信的记忆力。我的问题不是“为什么这个关键字用于此目的”(我可能会投票关闭,尽管只有在阅读了答案和评论之后),而是我如何才能思考 else 关键字,使其语义有意义,从而使我能够记住它?

我相信关于这一点已经有了相当多的讨论,我可以想象做出这样的选择是为了与try语句的else:子句(我也必须查找它)保持一致,并且目的是不添加到Python语句的保留字列表中。也许选择else的原因会澄清它的功能,让它更令人难忘,但我是在将名称与功能联系起来,而不是在历史解释本身之后。

this question的答案包含了许多有趣的背景故事,我的问题被简单地关闭为副本。我的问题有一个不同的焦点(如何将else的特定语义与关键字选择联系起来),但我觉得这个问题应该有一个链接。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2016-06-06 00:54:53

如果条件的计算结果为false,则if语句将运行其else子句。同样,如果while循环的条件计算结果为false,则该循环运行else子句。

此规则与您描述的行为相匹配:

  • 在正常执行中,while循环会重复运行,直到条件的计算结果为false,因此退出循环自然会运行else子句。
  • 执行break语句时,您会退出循环而不计算条件,因此条件的计算结果不会为false,并且永远不会运行else子句。
  • 执行continue语句时,会再次计算条件,并执行通常在循环迭代开始时执行的操作。因此,如果条件为true,则继续循环,但如果条件为false,则运行退出循环的else clause.
  • Other方法,如return,不计算条件,因此不运行else子句。

for循环的行为与此相同。如果迭代器有更多的元素,就认为条件为true,否则就认为条件为false。

票数 214
EN

Stack Overflow用户

发布于 2016-06-05 23:02:49

最好这样想:如果前面的else块中的一切都正常,那么 for块将始终被执行,以至于它会耗尽。

在这个上下文中,Right意味着没有exception,没有break,没有return。任何劫持来自for的控制的语句都将导致绕过else块。

iterable中搜索项目时发现了一个常见的用例,当找到项目时,搜索将被调用,或者通过以下else块引发/打印"not found"标志:

for items in basket:
    if isinstance(item, Egg):
        break
else:
    print("No eggs in basket")  

continue不会劫持来自for的控制权,因此在for耗尽后,控制权将转到else

票数 36
EN

Stack Overflow用户

发布于 2016-06-05 22:46:52

if何时执行else?当它的条件为false时。这与while/else完全相同。因此,您可以将while/else看作是一个if,它会一直运行其true条件,直到其计算结果为false。break不会改变这一点。它只是跳出包含循环,没有求值。仅当评估if/while条件为false时,才执行else

for是相似的,除了它的false条件正在耗尽它的迭代器。

continuebreak不执行else。这不是他们的功能。break退出包含的循环。continue返回到包含循环的顶部,在那里计算循环条件。执行else的唯一方法就是将if/while求值为false (或者for没有更多的项)。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37642573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档