的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'?和循环语句的其他子句