Python语句的else语句

我注意到下面的代码在Python中是合法的。 我的问题是为什么? 有没有特定的原因?

n = 5 while n != 0: print n n -= 1 else: print "what the..." 

else子句只在while条件变为false时执行。 如果你break循环,或者如果引发exception,它将不会被执行。

考虑这个问题的一个方法就是作为一个关于条件的if / else构造:

 if condition: handle_true() else: handle_false() 

类似于循环构造:

 while condition: handle_true() else: # condition is false now, handle and go on with the rest of the program handle_false() 

一个例子可能包括以下几个方面:

 while value < threshold: if not process_acceptable_value(value): # something went wrong, exit the loop; don't pass go, don't collect 200 break value = update(value) else: # value >= threshold; pass go, collect 200 handle_threshold_reached() 

如果你正常退出一个块,按下循环条件或从一个try块的底部落下, else子句将被执行。 如果你breakreturn一个块,或者引发一个exception,它不会被执行。 它不仅适用于循环,而且适用于块。

您通常会在通常情况下会在早期退出循环的地方find它,并且在循环结束时运行是意外/exception情况。 例如,如果您正在循环查找值的列表:

 for value in values: if value == 5: print "Found it!" break else: print "Nowhere to be found. :-(" 

在回复中Is there a specific reason? ,这是一个有趣的应用程序:打破了多个层次的循环。

下面是它的工作原理:外层循环最后有一个中断,所以它只会被执行一次。 但是,如果内部循环完成(找不到除数),那么它将到达else语句,并且永远不会到达外部中断。 这样,内部循环中的一个中断就会从两个循环中分离出来,而不仅仅是一个。

 for k in [2, 3, 5, 7, 11, 13, 17, 25]: for m in range(2, 10): if k == m: continue print 'trying %s %% %s' % (k, m) if k % m == 0: print 'found a divisor: %d %% %d; breaking out of loop' % (k, m) break else: continue print 'breaking another level of loop' break else: print 'no divisor could be found!' 

在大多数情况下,有更好的方法来做到这一点(包装成一个函数或引发exception),但这个工作!

else-clause在while-condition计算为false时执行。

从文档 :

只要expression式为真,while语句就用于重复执行:

 while_stmt ::= "while" expression ":" suite ["else" ":" suite] 

这反复testingexpression式,如果它是真的,执行第一个套件; 如果expression式为假(可能是第一次被testing),则else子句(如果存在)的套件被执行,并且循环终止。

在第一个套件中执行的break语句终止循环,而不执行else子句的套件。 在第一个套件中执行的continue语句会跳过套件的其余部分,然后返回testingexpression式。

我的答案将集中在什么时候我们可以使用while / for-else。

乍一看,使用时似乎没有什么不同

 while CONDITION: EXPRESSIONS print 'ELSE' print 'The next statement' 

 while CONDITION: EXPRESSIONS else: print 'ELSE' print 'The next statement' 

因为print 'ELSE'语句似乎总是在两种情况下都执行(当while循环完成或不运行时)。

然后, 只有当语句print 'ELSE'不会被执行时才会有所不同。 这是在代码块内部breakwhile

 In [17]: i = 0 In [18]: while i < 5: print i if i == 2: break i = i +1 else: print 'ELSE' print 'The next statement' ....: 0 1 2 The next statement 

如果不同于:

 In [19]: i = 0 In [20]: while i < 5: print i if i == 2: break i = i +1 print 'ELSE' print 'The next statement' ....: 0 1 2 ELSE The next statement 

return不属于这个范畴,因为它对两个以上的情况都有同样的效果。

exception引发也不会引起差异,因为在引发exception处理程序(除了block)之后将执行下一个代码的情况下, else子句中或while子句之后的代码将不会执行。

当且仅当while循环不再满足条件时,才执行else:语句(在你的例子中,当n != 0是假的时候)。

所以输出是这样的:

 5 4 3 2 1 what the... 

如果在'while'中没有执行循环,那么在Python中'while:else:'结构的使用应该更好,然后执行'else'语句。 它今天的工作方式是没有意义的,因为你可以使用下面的代码具有相同的结果…

 n = 5 while n != 0: print n n -= 1 print "what the..."