我最近偶然发现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
。我忽略了什么?
嗯,这取决于您如何看待它。您可以像这样查看其他情况(不好意思,这是强调代码的唯一方法):
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()
您想以哪种方式看待其他情况,这取决于您,但是在两种查看方式中,其他三种情况确实都有相似之处。
如果没有为循环执行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"
是的,正如Eli所说,else子句只有在不中断的情况下才执行。它阻止您实现这样的代码:
for i in range(1,10):
if i % 5 == 0:
print i
break
if i % 5 != 0:
print "nothing divisible by 5"
这里大致相等,但是如果要退出的条件更加复杂(例如检查各种可能的条件或条件的组合),则非常方便。