繁体   English   中英

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

[英]Why does else behave differently in for/while statements as opposed to if/try statements?

我最近偶然发现 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 我在看什么?

如果没有为循环执行break语句,则for else构造将执行else子句, 如此处所述例如,永远不会评估此 else 子句

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

嗯,这取决于你如何看待它。 你可以这样看 elses(原谅尖叫,这是在代码中强调的唯一方法):

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/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 在所有三种情况下确实有相似之处。

是的,正如 Eli 所提到的,else 子句只有在您不中断时才会执行。 它阻止你实现这样的代码:

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

这在这里大致等效,但如果退出条件有点复杂(例如检查各种可能的条件或条件的组合),则很方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM