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