For-else:Python中一個奇怪但有用的特性

語言: CN / TW / HK

無論使用哪種程式語言,我們都會編寫“if-else”語句,但是“for-else”呢?

對於許多語言來說,例如 C、C++ 和 Java,在一個迴圈後使用“else”是完全錯誤的。然而 Python 作為一門優雅的語言,擁有這個“奇怪但有用”的特性。如果使用得當,我們的程式碼會變得更加整潔。

本文將介紹 Python 中的“for-else”功能,並通過簡單的示例說明如何正確地使用它。

有關“For-Else”功能的基礎知識

當第一次遇到“for-else”這個特性時,它會看起來很奇怪而且難以理解(Python開發者主頁君剛開始用到這個功能時,很容易誤以為 else 縮排錯了)。但實際上,它的用法卻出乎意料的簡單。一句話就足以說明:程式碼中的“else”塊僅在迴圈中沒有中斷時執行。

聽起來有點過於簡單而顯得不真實?讓我們通過一個例子來看看:

leaders = ["Elon", "Tim", "Warren"]
for i in leaders:
   if i == "Yang":
       print("Yang is a leader!")
       break
else:
   print("Not found Yang!")
# Not found Yang!

如上所示:如上所示,leaders 列表中不包含“Yang”,故我們的 for 迴圈中沒有中斷。因此“else”塊執行並列印了資訊。

如果 leaders 列表中包含“Yang”,會如何呢?

leaders = ["Yang", "Elon", "Tim", "Warren"]
for i in leaders:
   if i == "Yang":
       print("Yang is a leader!")
       break
else:
   print("Not found Yang!")
# Yang is a leader!

如上所示,由於leaders 列表中包含“Yang”,for 迴圈被中斷,“else”塊中的內容沒有執行。

簡而言之,for-else 特性本身並不難理解,但是正確而熟練地使用它並不容易。下面我們來介紹三種適合使用 for-else 特性的場景。

使用 For-Else 功能的 3 個場景

我們不一定必須在 Python 程式中使用 for-else 這一特性。老實說,沒有它我們也可以做同樣的事情,但是使用它可以使我們的程式碼更加優雅。

1.進行迭代並找出沒有被標記的元素

迭代列表以查詢特定的元素是使用迴圈的基本場景。通常當我們找到目標元素後,繼續迭代是沒有意義的,我們需要跳出迴圈。問題是:我們如何知道該元素是否被找到呢?

傳統的解決方案是定義一個“標記”變數,並在我們找到特定專案時將其設定為 True。

leaders = ["Yang", "Elon", "Tim", "Warren"]
have_yang = False
for i in leaders:
   if i == "Yang":
       have_yang = True
       # Do something
       break
if have_yang == False: # no yang
   ...  # Do others

如上例所示,have_yang 變數就是一個標誌。在 for 迴圈執行完成後,如果它的值是 False,我們就知道列表中沒有“Yang”,而後可以做一些其他的操作。

這種方法已經足夠好了,但是如果你想利用 Python 的“優雅”特性,使用 for-else 就是另一種選擇:

leaders = ["Yang", "Elon", "Tim", "Warren"]
for i in leaders:
   if i == "Yang":
       have_yang = True
       # Do something
       break
else:  # no yang
   ...  # Do others

這種寫法看起來更整潔,對吧?

2. 用於跳出巢狀迴圈

當代碼中存在巢狀迴圈時,for-else 也可以提供幫助。

for i in range(5):
   for j in range(5):
       if j == 2 and i == 0:
           break
   if not (j == 2 and i == 0):
       continue
    break

如上所示,跳出巢狀迴圈有一點困難,因為我們必須知道內部迴圈是否被跳出。

上面的程式碼展示了一個笨拙的解決方案來確定內部迴圈是否已經中斷。它當然可以正常工作,但我們可以通過使用 for-else 來使其更整潔:

# use the for-else syntax
for i in range(5):
   for j in range(5):
       if j == 2 and i == 0:
           break
   else:  # only execute when it's no break in the inner loop
       continue
   break

3.協助處理異常

nums = [1, 3, 0, 5]
for denominator in nums:
   try:
       20/denominator
   except ZeroDivisionError:
       break
else:  # no found ZeroDivisionError
   ...  # Do others

如上所示,如果 for 迴圈中沒有出現 ZeroDivisionError,我們可以在“else”塊中進行相應的後續操作。

Python 中的 for-else 特性乍一看會有些奇怪,但是它的用法並不難理解,並且在某些場景下可以發揮其用處。畢竟,我們只需要記住一條規則:“else”塊僅在迴圈中沒有中斷時執行。