掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
讓我們通過幾個(gè)簡單的例子總結(jié)Python中可用的幾種短路機(jī)制:

創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元奉新做網(wǎng)站,已為上家服務(wù),為奉新各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
X or Y是最常用的短路機(jī)制,我們都知道只要X或Y中至少有一個(gè)為True時(shí),整段判斷表達(dá)式就為True,譬如下面的例子中,本來1 / 0會觸發(fā)ZeroDivisionError: division by zero錯(cuò)誤,但因?yàn)閛r左邊的部分已經(jīng)邏輯判斷為True,Python的短路機(jī)制就會停止后續(xù)的執(zhí)行,直接返回or左邊的結(jié)果:
而當(dāng)or左邊部分邏輯判斷為False時(shí),則會返回右邊部分的結(jié)果:
類似X or Y的機(jī)制,X and Y會在X邏輯判斷為False時(shí)提前終止后續(xù)的運(yùn)算,只返回X部分的結(jié)果:
Python中的any()函數(shù)用于接受序列形式的多個(gè)等待邏輯判斷的部分,并在序列中至少有一個(gè)部分邏輯判斷為True時(shí)返回True。
而只要any()按順序遇到第一個(gè)邏輯判斷為True的結(jié)果,也會觸發(fā)短路,正如下面的例子中只花費(fèi)3秒就完成了判斷過程,因?yàn)檠h(huán)到1時(shí)觸發(fā)了短路:
Python中的all()函數(shù)類似any(),會在傳入序列中每個(gè)部分邏輯判斷均為True時(shí)返回True,其也會在按順序遇到第一個(gè)False時(shí)終止后續(xù)運(yùn)算:
Python中用于數(shù)值大小比較的各個(gè)運(yùn)算符也具有短路機(jī)制,從左到右,一旦執(zhí)行到判斷結(jié)果為False的部分都會終止運(yùn)算:
當(dāng)我們的代碼中涉及到條件判斷,且參與條件判斷的值具有一定的「運(yùn)算成本」時(shí),就可以靈活運(yùn)用短路機(jī)制來提升運(yùn)行效率,譬如我們需要根據(jù)用戶id信息向多個(gè)接口查詢其權(quán)限,全部滿足時(shí)將其標(biāo)記為“超級權(quán)限”,就可以利用到短路機(jī)制。
這里我們隨意寫幾個(gè)具有時(shí)間成本的函數(shù)作為接口示意:
def api1(id_):
time.sleep(1)
return id_ in ['admin1', 'admin2']
def api2(id_):
time.sleep(1)
return id_ in ['admin1', 'admin2', 'su1', 'su2']
def api3(id_):
time.sleep(1)
return id_ not in ['ban1', 'ban2', 'ban3']
利用短路機(jī)制在用戶第一次沒有滿足條件時(shí)就終止后續(xù)判斷,寫法簡潔:

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流