关于Python while statemens的Else子句

2024-04-24 15:03:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: the代码原因whatelseprintwhile合法
3条回答

只有当while条件变为false时,才会执行else子句。如果break超出循环,或者引发异常,则不会执行该异常。

一种方法是将其视为条件的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或引发异常,则不会执行not。它不仅适用于while和循环,还适用于try块。

你通常会在一些地方发现它,在这些地方,你通常会提前退出一个循环,而离开循环的末尾是一个意外/不寻常的情况。例如,如果在列表中循环查找值:

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!'

对于whilefor循环,在结尾执行else语句,除非使用break

在大多数情况下,有更好的方法可以做到这一点(将其包装成函数或引发异常),但这是可行的!

相关问题 更多 >