带有 else 子句的循环

forwhile 复合语句(循环)可以选择具有 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,如果我们根据结构化编程前几天的 if 语句和 goto 语句或者从较低级别的汇编语言重写循环,else 关键字的含义就变得清晰了。

例如:

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

相当于:

# pseudocode

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

<<end>>:

如果我们将 else 条款附加到每个条款中,它们仍然是等价的。

例如:

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

相当于:

# pseudocode

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

<<end>>:

具有 else 子句的 for 循环可以以相同的方式理解。从概念上讲,只要可迭代对象或序列仍有一些剩余元素,就会有一个循环条件保持为 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 更容易混淆,人们可以将其视为如果没有破坏如果没有找到

关于这个的一些讨论可以在 [Python-ideas] for … else thread for Summary 中找到为什么 python 在 for 和 while 循环后使用’else’?循环陈述中的其他条款