带有 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,如果我们根据结构化编程前几天的 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’?和循环陈述中的其他条款