一、包含一個(gè)邏輯運(yùn)算符
首先從基本的概念著手,python中哪些對(duì)象會(huì)被當(dāng)成False呢?而哪些又是True呢?
在Python中,None、任何數(shù)值類型中的0、空字符串“”、空元組()、空列表[]、空字典{}都被當(dāng)作False,還有自定義類型,如果實(shí)現(xiàn)了__nonzero__()或__len__()方法且方法返回0或False,則其實(shí)例也被當(dāng)作False,其他對(duì)象均為True。
下面是最簡單的邏輯運(yùn)算:這里1,2都是Ture;0,‘’都是False
1and2==>21or2==>1
1and0==>01or0==>1
0and1==>00or1==>1
0and''==>00or''==>''
總結(jié):
or從左到右,返回第一個(gè)為真的值,都為假返回后一個(gè)值
and從左到右,若所有值均為真,則返回后一個(gè)值,有一個(gè)假的值,則返回第一個(gè)假的值
二、包含兩個(gè)及以上的邏輯運(yùn)算符
邏輯運(yùn)算符and/or一旦不止一個(gè),其運(yùn)算規(guī)則的核心思想就是短路邏輯。好的,那我們就來了解一下短路思想:
表達(dá)式從左至右運(yùn)算,若or的左側(cè)邏輯值為True,則短路or后所有的表達(dá)式(不管是and還是or),直接輸出or左側(cè)表達(dá)式。
表達(dá)式從左至右運(yùn)算,若and的左側(cè)邏輯值為False,則短路其后所有and表達(dá)式,直到有or出現(xiàn),輸出and左側(cè)表達(dá)式到or的左側(cè),參與接下來的邏輯運(yùn)算。
若or的左側(cè)為False,或者and的左側(cè)為True則不能使用短路邏輯。
就讓我們從簡單的開始,假設(shè)全是and語句或者全是or語句:
example1
defa():
print('A')
return[]
defb():
print('B')
return1
defc():
print('C')
return1
defd():
print('D')
return[]
defe():
print('E')
return1
ifa()andb()andc()andd()ande():
print('ok')
a()為假,其后均為and語句,全部短路,最終只返回a()的表達(dá)式。記住,所有被短路的表達(dá)式均不會(huì)被輸出。所以,此處僅僅打印A。
example2
defa():
print('A')
return1
defb():
print('B')
return1
defc():
print('C')
return[]
defd():
print('D')
return1
defe():
print('E')
return1
ifa()andb()andc()andd()ande():
print('ok')
python從左至右先執(zhí)行a(),a()返回的邏輯值為True,后面是and語句,所以不能短路其后,繼續(xù)與b()進(jìn)行邏輯運(yùn)算,a()andb()輸出b()的邏輯值True,接著與c()進(jìn)行邏輯運(yùn)算,b()andc()輸出c()的邏輯值False,而其后均為and語句,則全部短路,最終只打印了ABC。
example3
defa():
print('A')
return1
defb():
print('B')
return1
defc():
print('C')
return[]
defd():
print('D')
return1
defe():
print('E')
return[]
ifa()orb()orc()ord()ore():
print('ok')
a()的邏輯值為True,其后均為or語句,全部短路,最終只打印了A,而if語句為True,所以還要打印一個(gè)ok。
example4
defa():
print('A')
return[]
defb():
print('B')
return[]
defc():
print('C')
return1
defd():
print('D')
return[]
defe():
print('E')
return1
ifa()orb()orc()ord()ore():
print('ok')
python從左至右先執(zhí)行a(),a()返回的邏輯值為False,后面是or語句,所以不能短路其后,繼續(xù)與b()進(jìn)行邏輯運(yùn)算,a()orb()輸出b()的邏輯值False,接著與c()進(jìn)行邏輯運(yùn)算,b()orc()輸出c()的邏輯值True,而其后為or語句,則全部短路,最終只打印了ABCok。
下面我們就來講一下and與or語句同時(shí)存在的情況:
example5
defa():
print('A')
return[]
defb():
print('B')
return[]
defc():
print('C')
return1
defd():
print('D')
return[]
defe():
print('E')
return1
deff():
print('F')
return1
defg():
print('G')
return[]
defh():
print('H')
return1
ifa()andb()andc()andd()ore()andf()org()andh():
print('ok')
別以為語句很長就很難,我們好好分析一下,從左至右,首先a()的邏輯值為False,其后到or語句為止有三個(gè)and語句:a()andb()andc()andd(),均被短路。只輸出a(),得到a()ore()為True,輸出e(),得e()andF()為True,輸出f(),其后接or語句,則短路其后所有。最終只打印了AEFok。(結(jié)合上面的三點(diǎn),慢慢分析)
三.三元運(yùn)算操作符
在python2.5之前,python是沒有三元操作符的,GuidoVanRossum認(rèn)為它并不能幫助python更加簡潔,但是那些習(xí)慣了c、c++和java編程的程序員卻嘗試著用and或者or來模擬出三元操作符,而這利用的就是python的短路邏輯。
三元運(yùn)算操作符bool?a:b,若bool為真則a,否則為b。
轉(zhuǎn)化為python語言為:
boolandaorb
如何理解呢?首先a,b都為真,這是默認(rèn)的。如果bool為真,則boolanda為真,輸出a,短路b。如果bool為假,短路a,直接boolorb,輸出b。
換一種更簡單的寫法:
returnaifboolelseb
以上內(nèi)容為大家介紹了python3中and和or運(yùn)算規(guī)律,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.2667701.com/