Python 中奇怪的else
條件語句中的 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 重寫此方法以進行異常處理和循環:
- 異常只能在 self.find_element(locator) 行中引發。如果未引發異常,則應執行退出循環。所以我們可以將break移動到else塊。
- 如果循環不是因為中斷而退出,我們的方法應該會引發異常。因此我們可以將異常引發移至迴圈的 else 子句。
- 如果您依序執行轉換 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。
