为什么for / while语句的行为与if / try语句相反?

问题描述 投票:6回答:3

我最近偶然发现Python在不同复合语句中处理else子句的方式似乎不一致。由于Python的设计如此出色,因此我相信会有很好的解释,但我想不到。

请考虑以下内容:

if condition:
   do_something()
else:
   do_something_else()

此处,仅当do_something_else()为假时才执行condition

类似地,在

try:
   do_something()
except someException:
   pass:
else:
   do_something_else()
finally:
   cleanup()

[do_something_else()仅在没有发生异常的情况下才执行。

但是在for或while循环中,始终执行else子句,无论for/while block的内容是否已执行。

for i in some_iterator:
   print(i)
else:
   print("Iterator is empty!")

无论我说some_iterator = []还是some_iterator = [1,2,3],都将始终打印“迭代器为空!”。 while-else子句中的行为相同。在我看来,在这些情况下else的行为更像finally。我忽略了什么?

python control-flow
3个回答
5
投票

嗯,这取决于您如何看待它。您可以像这样查看其他情况(不好意思,这是强调代码的唯一方法):

if condition:
   do_something()
IF THE PREVIOUS CONDITION WAS FALSE:
   do_something_else()

现在,如果您将else语句视为else语句的else语句,则if / else和try / except / else之间存在明显的相似性。像这样。

try:
   do_something()
IF THERE WAS AN EXCEPTION:
   pass:
IF THE PREVIOUS CONDITION WAS FALSE:
   do_something_else()
finally:
   cleanup()

同样适用于其他/针对:

IF some_iterator IS NOT EMPTY:
   i = next(some_iterator)
   print(i)
IF THE PREVIOUS CONDITION WAS FALSE:
   print("Iterator is empty!")

所以在这里我们看到else在某些基本情况下do在所有三种情况下都完全相同。

但是您也可以通过这种方式查看其他:

try:
   do_something()
except someException:
   pass:
IF NO EXCEPTION:
   do_something_else()
finally:
   cleanup()

然后不再是相同的,而是其他,因为某种“如果没有别的”。您可以用相同的方式查看for / else:

for i in some_iterator:
   print(i)
IF NO MORE ITERATING:
   print("Iterator is empty!")

但是再考虑一下elif,然后这种查看方式也适用于if / else:

if condition:
   do_something()
elif otherconditaion:
   do_anotherthing()
IF NO CONDITION WAS TRUE:
   do_something_else()

您想以哪种方式看待其他情况,这取决于您,但是在两种查看方式中,其他三种情况确实都有相似之处。


13
投票

如果没有为循环执行for else语句,则else构造将执行break子句,as described here例如,从不评估此else子句

for i in range(1,10):
    if i % 5 == 0:
       print i
       break
else:
    print "nothing divisible by 5"

4
投票

是的,正如Eli所说,else子句只有在不中断的情况下才执行。它阻止您实现这样的代码:

for i in range(1,10):
    if i % 5 == 0:
       print i
       break
if i % 5 != 0:
   print "nothing divisible by 5"

这里大致相等,但是如果要退出的条件更加复杂(例如检查各种可能的条件或条件的组合),则非常方便。

© www.soinside.com 2019 - 2024. All rights reserved.