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