Python while 语句的 else 子句

409 投票
13 回答
264858 浏览
提问于 2025-04-16 01:36

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

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

很多初学者在尝试把if/else语句放到whilefor循环里时,常常会不小心把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 块的底部结束时。它不会在你使用 breakreturn 退出代码块,或者抛出异常时执行。这个特性不仅适用于 whilefor 循环,也适用于 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()

撰写回答