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