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

Tim*_*ker 6 python flow-control

我最近偶然发现了Python在不同复合语句中处理else子句的方式似乎不一致.由于Python设计得很好,我确信有一个很好的解释,但我想不到它.

考虑以下:

if condition:
   do_something()
else:
   do_something_else()
Run Code Online (Sandbox Code Playgroud)

这里do_something_else()只有if condition是假的才会执行.

同样地,在

try:
   do_something()
except someException:
   pass:
else:
   do_something_else()
finally:
   cleanup()
Run Code Online (Sandbox Code Playgroud)

do_something_else() 仅在未发生异常时执行.

但是在for或while循环中,总是执行else子句,无论是否for/while block已经执行了内容.

for i in some_iterator:
   print(i)
else:
   print("Iterator is empty!")
Run Code Online (Sandbox Code Playgroud)

将永远打印"Iterator is empty!",无论我是说some_iterator = []还是some_iterator = [1,2,3].while-else子句中的行为相同.在我看来,在这些情况下else表现得更像finally.我在俯瞰什么?

Eli*_*ght 13

for else构建执行else,如果没有条款break语句的循环执行,如这里所描述 例如,这else子句不会求

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


Len*_*bro 5

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

if condition:
   do_something()
IF THE PREVIOUS CONDITION WAS FALSE:
   do_something_else()
Run Code Online (Sandbox Code Playgroud)

现在,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()
Run Code Online (Sandbox Code Playgroud)

对于else/for也是如此:

IF some_iterator IS NOT EMPTY:
   i = next(some_iterator)
   print(i)
IF THE PREVIOUS CONDITION WAS FALSE:
   print("Iterator is empty!")
Run Code Online (Sandbox Code Playgroud)

所以在这里我们看到,在一些根本途径别人工作,在所有三种情况完全一样.

但你也可以用这种方式看到别的:

try:
   do_something()
except someException:
   pass:
IF NO EXCEPTION:
   do_something_else()
finally:
   cleanup()
Run Code Online (Sandbox Code Playgroud)

然后它不再是相同的了,而是其他因为某种"如果没有别的".您可以以相同的方式查看/ else:

for i in some_iterator:
   print(i)
IF NO MORE ITERATING:
   print("Iterator is empty!")
Run Code Online (Sandbox Code Playgroud)

但是再一次,考虑到elif,那么这种看待它的方式也适用于if/else:

if condition:
   do_something()
elif otherconditaion:
   do_anotherthing()
IF NO CONDITION WAS TRUE:
   do_something_else()
Run Code Online (Sandbox Code Playgroud)

您希望以何种方式查看其他内容取决于您,但在两种查看方式中,在所有三种情况下都有相似之处.