我最近偶然发现了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!")
总是会打印“Iterator is empty!”,无论我说some_iterator = []
还是some_iterator = [1,2,3]
。 while-else
子句中的行为相同。在我看来,else
在这些情况下的行为更像finally
。我在俯瞰什么?
答案 0 :(得分: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"
答案 1 :(得分:5)
嗯,这取决于你如何看待它。你可以看看这样的精灵(请原谅尖叫,这是强调代码的唯一方法):
if condition:
do_something()
IF THE PREVIOUS CONDITION WAS FALSE:
do_something_else()
现在,if / else和try / except / else之间存在明显的相似性,如果您将else语句看作except语句的else。像这样。
try:
do_something()
IF THERE WAS AN EXCEPTION:
pass:
IF THE PREVIOUS CONDITION WAS FALSE:
do_something_else()
finally:
cleanup()
else / for:
也是如此IF some_iterator IS NOT EMPTY:
i = next(some_iterator)
print(i)
IF THE PREVIOUS CONDITION WAS FALSE:
print("Iterator is empty!")
所以在这里我们看到,在所有三种情况下,做的基本方式中的else工作完全相同。
但你也可以这样看待别人:
try:
do_something()
except someException:
pass:
IF NO EXCEPTION:
do_something_else()
finally:
cleanup()
然后它不再是相同的了,而是其他因为某种“如果没别的话”。你可以用同样的方式看到/ 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()
您想要查看其他哪种方式取决于您,但在两种查看方式中,在所有三种情况下确实都有相似之处。
答案 2 :(得分: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"
这里大致相当,但如果退出的条件有点复杂(比如检查各种可能的条件或条件的组合),那就很方便了。