许多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
的特定语义与关键字选择联系起来),但是我觉得应该在某个地方链接到这个问题。
(这是从@Mark Tolonen的回答中得到的启发。)
如果条件计算为false,则
if
语句运行其else
子句。 同样,如果else子句的条件计算结果为false,则while
循环运行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
与之类似,只是它的错误条件是耗尽它的迭代器。continue
和break
不要执行else
。那不是他们的职责。break
退出包含循环。continue
返回到包含循环的顶部,在那里计算循环条件。这是一种将if
/while
求值为false(或者for
没有更多项)的行为,它执行else
,没有其他方式。最好这样想:如果前面的
for
块中的所有东西都向右移动,那么else
块将始终执行。在此上下文中,右将意味着没有
exception
,没有break
,没有return
。任何从for
劫持控件的语句都将导致绕过else
块。在
iterable
中搜索项目时会发现一个常见的用例,对于该用例,在找到项目时会取消搜索,或者通过以下else
块引发/打印"not found"
标志:continue
不会劫持来自for
的控件,因此在for
耗尽后,控件将继续进行else
。相关问题 更多 >
编程相关推荐