许多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
的特定语义与关键字选择联系起来),但我觉得这个问题应该有一个链接。
发布于 2016-06-06 00:54:53
如果条件的计算结果为false,则if
语句将运行其else
子句。同样,如果while
循环的条件计算结果为false,则该循环运行else子句。
此规则与您描述的行为相匹配:
break
语句时,您会退出循环而不计算条件,因此条件的计算结果不会为false,并且永远不会运行else子句。continue
语句时,会再次计算条件,并执行通常在循环迭代开始时执行的操作。因此,如果条件为true,则继续循环,但如果条件为false,则运行退出循环的else clause.return
,不计算条件,因此不运行else子句。for
循环的行为与此相同。如果迭代器有更多的元素,就认为条件为true,否则就认为条件为false。
发布于 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
。
发布于 2016-06-05 22:46:52
if
何时执行else
?当它的条件为false时。这与while
/else
完全相同。因此,您可以将while
/else
看作是一个if
,它会一直运行其true条件,直到其计算结果为false。break
不会改变这一点。它只是跳出包含循环,没有求值。仅当评估if
/while
条件为false时,才执行else
。
for
是相似的,除了它的false条件正在耗尽它的迭代器。
continue
和break
不执行else
。这不是他们的功能。break
退出包含的循环。continue
返回到包含循环的顶部,在那里计算循环条件。执行else
的唯一方法就是将if
/while
求值为false (或者for
没有更多的项)。
https://stackoverflow.com/questions/37642573
复制相似问题