Python带有“ else”子句的循环

示例

的for和while复合语句(环路)可以可选地具有一个else条款(在实践中,这种用法是相当罕见的)。

该else子句仅在for循环通过迭代终止而终止之后执行,或者在while循环的条件表达式变为false终止之后才执行。

for i in range(3):
    print(i)
else:
    print('done')

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('done')

输出:

 0
 1
 2
 done

该else条款并没有如果,循环终止一些其他的方式(通过执行break语句或通过引发异常):

for i in range(2):
    print(i)
    if i == 1:
        break
else:
    print('done')

输出:

0
1

大多数其他编程语言都缺少else循环的此可选子句。else特别是关键字的使用通常被认为是令人困惑的。

这种子句的原始概念可以追溯到Donald Knuth,else如果我们从结构化编程之前的较早版本或较低级的汇编语言中用if语句和goto语句重写循环,则关键字的含义将变得清楚。

例如:

while loop_condition():
    ...
    if break_condition():
        break
    ...

等效于:

# 伪码

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>

<<end>>:

如果我们else在每个子句上附加一个子句,它们将保持等效。

例如:

while loop_condition():
    ...
    if break_condition():
        break
    ...
else:
    print('done')

等效于:

# 伪码

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>
else:
    print('done')

<<end>>:

for带有else子句的循环可以用相同的方式理解。从概念上讲,只要可迭代对象或序列仍有一些剩余元素,就有一个循环条件保持为True。

为什么要使用这种奇怪的构造?

for...else构造的主要用例是简洁的搜索实现,例如:

a = [1, 2, 3, 4]
for i in a:
    if type(i) is not int:
        print(i)
        break
else:
    print("no exception")

为了使else此构造中的混淆少一些,可以将其视为“如果没有破坏”或“如果没有发现”。

有关此问题的一些讨论可以在for ... else线程的[Python-ideas]摘要中找到,为什么python为什么在for和while循环之后使用'else'?和循环语句的其他子句