Python 中的 else詳解
我們都知道 Python 中else的基本用法是在條件控制語句中的 if...elif...else...,但是 else 還有兩個其它的用途,一是用于循環(huán)的結(jié)尾,另一個是用在錯誤處理的 try 中。這原本是 Python 的標準語法,但由于和大部分其它編程語言的習(xí)慣不太一樣,致使人們有意或無意地忽略了這些用法。另外,對于這些用法是否符合 0×00 The Zen of Python 的原則以及該不該廣泛使用也存在很多爭議。例如在我看到的兩本書里(Effective Python VS Write Idiomatic Python),兩位作者就分別對其持有截然不同的態(tài)度。
循環(huán)中的 else
跟在循環(huán)后面的 else 語句只有在當(dāng)循環(huán)內(nèi)沒出現(xiàn) break,也就是正常循環(huán)完成時才會執(zhí)行。首先我們來看一個插入排序法的例子:
from random import randrange def insertion_sort(seq): if len(seq) 1: return seq _sorted = seq[:1] for i in seq[1:]: inserted = False for j in range(len(_sorted)): if i _sorted[j]: _sorted = [*_sorted[:j], i, *_sorted[j:]] inserted = True break if not inserted: _sorted.append(i) return _sorted print(insertion_sort([randrange(1, 100) for i in range(10)])) [8, 12, 12, 34, 38, 68, 72, 78, 84, 90]
在這個例子中,對已排序的 _sorted 元素逐個與 i 進行比較,若 i 比已排序的所有元素都大,則只能排在已排序列表的最后。這時我們就需要一個額外的狀態(tài)變量 inserted 來標記完成遍歷循環(huán)還是中途被 break,在這種情況下,我們可以用 else 來取代這一狀態(tài)變量:
def insertion_sort(seq): if len(seq) 1: return seq _sorted = seq[:1] for i in seq[1:]: for j in range(len(_sorted)): if i _sorted[j]: _sorted = [*_sorted[:j], i, *_sorted[j:]] break else: _sorted.append(i) return _sorted print(insertion_sort([randrange(1, 100) for i in range(10)])) [1, 10, 27, 32, 32, 43, 50, 55, 80, 94]
我認為這是一個非??岬淖龇?!不過要注意的是,除了 break 可以觸發(fā)后面的 else 語句,沒有循環(huán)的時候也會:
while False: print("Will never print!") else: print("Loop failed!") Loop failed!
錯誤捕捉中的 else
try...except...else...finally 流程控制語法用于捕捉可能出現(xiàn)的異常并進行相應(yīng)的處理,其中 except 用于捕捉 try 語句中出現(xiàn)的錯誤;而 else 則用于處理沒有出現(xiàn)錯誤的情況;finally 負責(zé) try 語句的”善后工作“ ,無論如何都會執(zhí)行??梢酝ㄟ^一個簡單的例子來展示:
def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by 0!") else: print("result = {}".format(result)) finally: print("divide finished!") divide(5,2) print("*"*20) divide(5,0)
result = 2.5 divide finished! ******************** division by 0! divide finished!
當(dāng)然,也可以用狀態(tài)變量的做法來替代 else:
def divide(x, y): result = None try: result = x / y except ZeroDivisionError: print("division by 0!") if result is not None: print("result = {}".format(result)) print("divide finished!") divide(5,2) print("*"*20) divide(5,0)
result = 2.5 divide finished! ******************** division by 0! divide finished!
總結(jié)
有人覺得 else 的這些用法違反直覺或者是 implicit 而非 explicit,不值得提倡。但我覺得這種”判決“需要依賴具體的應(yīng)用場景以及我們對 Python 的理解,并非一定要對新人友好的語法才算是 explicit 的。當(dāng)然也不推薦在所有地方都使用這個語法,for/while...else 最大的缺點在于 else 是需要與 for/file 對齊的,如果是多層嵌套或者循環(huán)體太長的情況,就非常不適合用 else(回憶一下游標卡尺的梗就知道了:P)。只有在一些簡短的循環(huán)控制語句中,我們通過 else 擺脫一些累贅的狀態(tài)變量,這才是最 Pythonic 的應(yīng)用場景!
- Python深入學(xué)習(xí)之上下文管理器
- 深入解析Python中的上下文管理器
- Python中的with語句與上下文管理器學(xué)習(xí)總結(jié)
- 正確理解python中的關(guān)鍵字“with”與上下文管理器
- Python中的if、else、elif語句用法簡明講解
- Python中在for循環(huán)中嵌套使用if和else語句的技巧
- 在Python的while循環(huán)中使用else以及循環(huán)嵌套的用法
- 在Python的循環(huán)體中使用else語句的方法
- Python的for和break循環(huán)結(jié)構(gòu)中使用else語句的技巧
- 深入學(xué)習(xí)Python中的上下文管理器與else塊
相關(guān)文章
單身狗福利?Python爬取某婚戀網(wǎng)征婚數(shù)據(jù)
今天我就當(dāng)回媒婆,給男性程序員來點福利.今天目標爬取征婚網(wǎng)上呈現(xiàn)出來的女生信息保存成excel表格供大家篩選心儀的女生,需要的朋友可以參考下2021-06-06Python畫圖常用代碼總結(jié)大全(20個畫圖代碼現(xiàn)拿現(xiàn)用)
Python是一種高級編程語言,擁有豐富的圖形庫,可以完成繪制各種類型的圖形任務(wù),下面這篇文章主要給大家介紹了關(guān)于Python畫圖常用代碼的相關(guān)資料,文中介紹的這20個畫圖代碼可以現(xiàn)拿現(xiàn)用,需要的朋友可以參考下2023-06-06Python threading模塊condition原理及運行流程詳解
這篇文章主要介紹了Python threading模塊condition原理及運行流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10Python實現(xiàn)求解斐波那契第n項的解法(包括矩陣乘法+快速冪)
這篇文章主要介紹怎么使用Python求解斐波那契第n項,方法多樣,邏輯清晰,代碼簡單詳細,有這方面需要的朋友可以參考下2021-04-04對Pandas DataFrame缺失值的查找與填充示例講解
今天小編就為大家分享一篇對Pandas DataFrame缺失值的查找與填充示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python與Appium實現(xiàn)手機APP自動化測試的示例代碼
本文主要介紹了Python與Appium實現(xiàn)手機APP自動化測試的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02python實現(xiàn)獲取當(dāng)前設(shè)備的地點位置
這篇文章主要介紹了python實現(xiàn)獲取當(dāng)前設(shè)備的地點位置,電腦如何獲取當(dāng)前所處的地理位置?它不會像我們一樣對地理位置有感性的認知,它只認識數(shù)據(jù),簡言之,電腦可以通過獲取當(dāng)前連接的公網(wǎng)IP,反推所處的位置環(huán)境,需要的朋友可以參考一下2022-03-03Appium+Python實現(xiàn)簡單的自動化登錄測試的實現(xiàn)
這篇文章主要介紹了Appium+Python實現(xiàn)簡單的自動化登錄測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01