![](/img/trans.png)
[英]Why do python print statements that contain 'end=' arguments behave differently in while-loops?
[英]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.