为什么else / while语句中的else表现不同而不是if / try语句?

时间:2009-10-16 06:58:27

标签: python flow-control

我最近偶然发现了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。我在俯瞰什么?

3 个答案:

答案 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"

这里大致相当,但如果退出的条件有点复杂(比如检查各种可能的条件或条件的组合),那就很方便了。