Python while 语句的 else 子句
我注意到下面的代码在Python中是合法的。我想问问这是为什么?有没有什么特别的原因呢?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
很多初学者在尝试把if
/else
语句放到while
或for
循环里时,常常会不小心把else
的缩进搞错。解决这个问题的方法是确保else
的缩进和if
对齐,前提是你确实想把它们配对在一起。这个问题解释了为什么没有出现语法错误,以及结果代码的含义。 另外,你可以查看 我遇到了缩进错误。我该如何修复它?,了解那些确实有语法错误的情况。
还可以查看 为什么Python在for和while循环后使用'else'?,了解如何更好地利用这个特性。
13 个回答
43
让我给你举个例子,说明为什么要使用这个else
语句。不过:
- 我想说的内容现在在Leo的回答中解释得更清楚了
- 我用的是
for
循环,而不是while
循环,但else
的用法是类似的(在没有遇到break时会执行) - 其实还有更好的方法来实现这个功能(比如把它放到一个函数里,或者抛出一个异常)
跳出多层循环
它是这样工作的:外层循环在最后有一个break,所以它只会执行一次。不过,如果内层循环完成了(没有找到任何能整除的数),那么就会到达else语句,这样外层的break就不会被执行。这样,内层循环中的break会同时跳出两个循环,而不仅仅是一个。
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!'
144
else
语句是在你正常退出一个代码块时执行的,比如当你满足循环条件或者从一个 try
块的底部结束时。它不会在你使用 break
或 return
退出代码块,或者抛出异常时执行。这个特性不仅适用于 while
和 for
循环,也适用于 try
块。
你通常会在一些情况下看到它,比如你本来打算提前退出一个循环,而从循环的末尾结束则是个意外的情况。例如,如果你在遍历一个列表寻找某个值:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
483
else
这个部分只有在你的 while
条件变成假时才会执行。如果你在循环中使用了 break
跳出循环,或者发生了异常,这个 else
就不会被执行。
可以把它想象成一个和条件有关的 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()