我如何理解Python循环的'else'子句?

2024-05-16 14:59:47 发布

您现在位置:Python中文网/ 问答频道 /正文

许多Python程序员可能不知道while循环和for循环的语法包含一个可选的else:子句:

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

else子句的主体是执行某些类型清理操作的好地方,并在循环正常终止时执行:即,使用return退出循环或break跳过else子句;在continue执行后退出。我之所以知道这一点,是因为我只是looked it up(再一次),因为我永远记不起执行else子句时的

总是这样?循环的“失败”,顾名思义?定期终止?即使循环是用return退出的?如果不查一下,我永远无法完全确定。

我把我持续的不确定性归咎于关键字的选择:我发现对于这个语义来说,else难以置信的不易记忆。我的问题不是“为什么这个关键字被用于这个目的”(我可能会投票结束,虽然只有在阅读了答案和评论之后),而是我如何思考else关键字,以便它的语义有意义,因此我可以记住它?

我相信这方面的讨论是相当多的,而且我可以想象这样的选择是为了与try语句的else:子句(我还需要查找)保持一致,并且目的是不添加到Python的保留字列表中。也许选择else的原因会澄清它的功能,让它更令人难忘,但我是在把名字和功能联系起来之后,而不是在历史解释之后。

this question的回答包含了很多有趣的背景故事,我的问题作为副本简短地结束了。我的问题有一个不同的焦点(如何将else的特定语义与关键字选择联系起来),但是我觉得应该在某个地方链接到这个问题。


Tags: in目的功能forreturn地方语义语法
3条回答

(这是从@Mark Tolonen的回答中得到的启发。)

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

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

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

for循环的行为方式相同。如果迭代器有更多的元素,则将条件视为true,否则视为false。

什么时候if执行else?当它的条件是错误的。这与while/else完全相同。因此,您可以将while/else视为一个if,它一直运行其true条件,直到其计算结果为false。一个break并不能改变这一点。它只是跳出包含循环而没有求值。只有在计算if/while条件为false时,才会执行else

for与之类似,只是它的错误条件是耗尽它的迭代器。

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

最好这样想:如果前面的for块中的所有东西都向右移动,那么else块将始终执行。

在此上下文中,右将意味着没有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

相关问题 更多 >