Python 为什么for/while语句中的else行为与if/try语句不同?

Python 为什么for/while语句中的else行为与if/try语句不同?,python,control-flow,Python,Control Flow,最近,我无意中发现Python在处理不同复合语句中的else子句的方式似乎不一致。由于Python设计得如此之好,我相信有一个很好的解释,但我想不起来 考虑以下几点: if condition: do_something() else: do_something_else() 这里,do\u something\u else()仅在条件为false时执行,如预期的那样 同样,在 try: do_something() except someException: pass

最近,我无意中发现Python在处理不同复合语句中的else子句的方式似乎不一致。由于Python设计得如此之好,我相信有一个很好的解释,但我想不起来

考虑以下几点:

if condition:
   do_something()
else:
   do_something_else()
这里,
do\u something\u else()
仅在
条件
为false时执行,如预期的那样

同样,在

try:
   do_something()
except someException:
   pass:
else:
   do_something_else()
finally:
   cleanup()
do\u something\u else()
仅在未发生异常时执行

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

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

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

如果没有为循环执行
break
语句,则
for else
构造将执行
else
子句,例如,此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"

这在这里大致相当,但如果戒烟的条件稍微复杂一点(比如检查各种可能的条件或条件组合),就很方便了。

好吧,这取决于你如何看待它。你可以这样看待其他人(请原谅尖叫,这是在代码中强调重点的唯一方法):

现在,如果将else语句视为except语句的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()
else/的情况也一样:

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()
然后它就不再是原来的样子了,而是另一个,因为有一种“如果没有其他的话”。您可以用相同的方式查看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()

您想以何种方式查看else取决于您,但在两种查看方式中,else在所有三种情况下都有相似之处。

我很惊讶Python允许使用这种语法。在大多数其他语言中,-else仅限于与if-或switch语句一起使用。For循环和try语句可能控制流,但它们不像if语句那样是有条件的,因此-else在其中没有位置。值得一提的是,最近在python思想列表中对For/else等进行了长时间的讨论,总结如下:。圭多自己承认对此有第二个想法:谢谢。这是有意义的,并且回答了我的问题。对,所以for/while-else语句只有在某个地方有break语句时才有意义。
if condition:
   do_something()
elif otherconditaion:
   do_anotherthing()
IF NO CONDITION WAS TRUE:
   do_something_else()