帶有 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’?和迴圈陳述中的其他條款