首頁 > 後端開發 > Python教學 > Python 中奇怪的&#else&#

Python 中奇怪的&#else&#

Susan Sarandon
發布: 2025-01-03 03:32:39
原創
998 人瀏覽過

The Strange

條件語句中的 else

我們都寫過條件語句,並且可能至少使用過一次完整的 if-elif-else 結構。
例如,為所需的瀏覽器建立 Web 驅動程式實例時:

browser = get_browser()
if browser == 'chrome':
    driver = Chrome()
elif browser == 'firefox':
    driver = Firefox()
else:
    raise ValueError('Browser not supported')
登入後複製
登入後複製

此程式碼段支援使用 Chrome 和 Firefox 進行測試,如果提供不支援的瀏覽器,則會引發異常。

一個鮮為人知的事實是,Python 支援將 else 子句與循環和異常處理結合使用。

Else 帶循環

假設我們有一個單字列表,我們想要列印它們,只要它們以大寫字母開頭。最後,我們要檢查是否所有單字都已處理,如果是,則執行特定邏輯。

我們可以使用標誌變數 is_all_words_processed,如果遇到無效單詞,則將其設為 False,然後在循環外檢查它以執行邏輯。

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
is_all_words_processed = True
for season in seasons:
    if not season.istitle():
        is_all_words_processed = False
        break
    print(season)

if is_all_words_processed:
    print('All seasons were processed')
登入後複製
登入後複製

Python 讓我們透過將所有單字都有效時的邏輯放入 else 子句中來避免附加變數:

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
for season in seasons:
    if not season.istitle():
        break
    print(season)
else:
    print('All seasons were processed')
登入後複製
登入後複製

只有當迴圈自然完成且沒有中斷時,else 區塊才會執行。如果循環被break中斷,則else子句將不會運行。
這是用 while 迴圈重寫的相同範例。對於 while,else 子句的行為方式相同:

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
index = 0
while index < len(seasons):
    if not seasons[index].istitle():
        break
    print(seasons[index])
    index += 1
else:
    print('All seasons were processed')
登入後複製
登入後複製

異常處理中的else

else 子句也可以用於異常處理。除了塊之外,它必須在所有之後出現。只有當 try 區塊中沒有引發異常時,else 區塊內的程式碼才會執行。

例如,讓我們讀取一個包含兩列數字的檔案並列印它們的商數。我們需要處理無效的檔案名,而任何其他錯誤(例如,將值轉換為數字或除以零)都會導致程式崩潰(我們不會處理它們)。

file_name = 'input.dat'
try:
    f = open(file_name, 'r')
except FileNotFoundError:
    print('Incorrect file name')
else:
    for line in f:
        a, b = map(int, line.split())
        print(a / b)
    f.close()
登入後複製

在此範例中,try 區塊僅包含可能引發捕獲的異常的程式碼。
官方文件建議使用 else 區塊來避免無意中捕獲 try 區塊之外的程式碼引發的異常。儘管如此,在異常處理中使用 else 可能感覺並不直觀。

將 Else 與循環和異常處理結合

這是我在訪談中提出的問題。
假設我們有一個帶有 find_element 方法的 Driver 類別。 find_element 方法要麼傳回一個元素,要麼引發 ElementNotFoundException 異常。在此範例中,它的實作是隨機傳回一個元素或以相等的機率引發異常。

使用基本的 Python 語法,實作一個方法 smart_wait(self, locator: str, timeout: float, step: float),該方法每步秒檢查具有給定定位器的元素。如果在逾時秒內找到該元素,則傳回;否則,引發 ElementNotFoundException 異常。

browser = get_browser()
if browser == 'chrome':
    driver = Chrome()
elif browser == 'firefox':
    driver = Firefox()
else:
    raise ValueError('Browser not supported')
登入後複製
登入後複製

這是實作此方法的一種方法:

  • 只要超時未到,就會嘗試找出元素。
  • 如果找到該元素,則退出循環。
  • 如果沒有找到元素,則等待步長間隔。
  • 如果超過逾時,則引發 ElementNotFoundException。 這是一個簡單的實作:
seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
is_all_words_processed = True
for season in seasons:
    if not season.istitle():
        is_all_words_processed = False
        break
    print(season)

if is_all_words_processed:
    print('All seasons were processed')
登入後複製
登入後複製

我們可以透過使用 return 而不是 break 來稍微縮短邏輯,但現在讓我們將其保留為 i 。

其實這個方法是在Selenium的WebDriverWait類別中實現的-until方法:

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
for season in seasons:
    if not season.istitle():
        break
    print(season)
else:
    print('All seasons were processed')
登入後複製
登入後複製

現在,讓我們使用 else 重寫此方法以進行異常處理和循環:

  1. 異常只能在 self.find_element(locator) 行中引發。如果未引發異常,則應執行退出循環。所以我們可以將break移動到else塊。
  2. 如果循環不是因為中斷而退出,我們的方法應該會引發異常。因此我們可以將異常引發移至迴圈的 else 子句。
  3. 如果您依序執行轉換 1 和 2,您會發現當前時間只能在循環條件下取得。

完成這些轉換後,我們得到了一個使用 else 語句進行異常處理和循環的方法:

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
index = 0
while index < len(seasons):
    if not seasons[index].istitle():
        break
    print(seasons[index])
    index += 1
else:
    print('All seasons were processed')
登入後複製
登入後複製

我能說什麼...這是 Python 鮮為人知的功能之一。不頻繁使用可能會使其在每種情況下使用起來不太直觀——這可能會導致混亂。然而,了解它並在需要時有效地應用它無疑是值得的。

新年快樂! ???

P.S.真的很可怕嗎? :
我自己寫文章,但使用 ChatGPT 來翻譯它們。為了翻譯,我刪除了所有程式碼片段,但 ChatGPT 恢復了所有程式碼片段?

以上是Python 中奇怪的&#else&#的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板