無論使用哪一種程式語言,我們都會寫「if-else」語句,但是「for-else」呢?
對許多語言來說,例如 C、C 和 Java,在一個循環後使用「else」是完全錯誤的。然而 Python 作為一門優雅的語言,擁有這個「奇怪但有用」的特性。如果使用得當,我們的程式碼會變得更加整潔。
本文將介紹 Python 中的「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 特性的場景。
我們不一定必須在 Python 程式中使用 for-else 這個特性。老實說,沒有它我們也可以做同樣的事情,但是使用它可以使我們的程式碼更加優雅。
迭代列表以尋找特定的元素是使用循環的基本場景。通常當我們找到目標元素後,繼續迭代是沒有意義的,我們需要跳出循環。問題是:我們如何知道該元素是否被找到?
傳統的解決方案是定義一個「標記」變量,並在我們找到特定項目時將其設為 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
這種寫法看起來更整潔,對吧?
當程式碼中存在巢狀循環時,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
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」區塊僅在循環中沒有中斷時執行。
以上是For-else:Python中一個奇怪但有用的特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!