python3 中 and 和 or 運算規律

pythontab發表於2018-06-26

一、包含一個邏輯運算子

首先從基本的概念著手,python中哪些物件會被當成 False 呢?而哪些又是 True 呢?

在Python中,None、任何數值型別中的0、空字串“”、空元組()、空列表[]、空字典{}都被當作False,還有自定義型別,如果實現了  __ nonzero __ () 或 __ len __ () 方法且方法返回 0 或False,則其例項也被當作False,其他物件均為True。

下面是最簡單的邏輯運算: 這裡 1,2 都是Ture;  0,‘’都是False

    1  and  2    ==> 2                1  or  2    ==>  1

    1  and  0    ==> 0                1  or  0    ==>  1

    0  and  1    ==> 0                0  or  1    ==>  1

    0  and  ''   ==> 0                0  or  ''   ==>  ''

總結: 

or 從左到右,返回第一個為真的值,都為假返回後一個值

and 從左到右,若所有值均為真,則返回後一個值,有一個假的值,則返回第一個假的值


二、包含兩個及以上的邏輯運算子

邏輯運算子 and / or 一旦不止一個,其運算規則的核心思想就是短路邏輯。好的,那我們就來了解一下短路思想:

表示式從左至右運算,若 or 的左側邏輯值為 True ,則短路 or 後所有的表示式(不管是 and 還是 or),直接輸出 or 左側表示式 。

表示式從左至右運算,若 and 的左側邏輯值為 False ,則短路其後所有 and 表示式,直到有 or 出現,輸出 and 左側表示式到 or 的左側,參與接下來的邏輯運算。

若 or 的左側為 False ,或者 and 的左側為 True 則不能使用短路邏輯。

就讓我們從簡單的開始,假設全是 and 語句 或者全是 or 語句:

example 1

def a():
    print ('A')
    return []
def b():
    print ('B')
    return 1
def c():
    print ('C')
    return 1
def d():
    print ('D')
    return []
def e():
    print ('E')
    return 1
    
if a() and b() and c() and d() and e():
    print ('ok')

a() 為假 ,其後均為 and 語句,全部短路,最終只返回 a() 的表示式。記住,所有被短路的表示式均不會被輸出。所以,此處僅僅列印 A 。

example 2

def a():
    print ('A')
    return 1
def b():
    print ('B')
    return 1
def c():
    print ('C')
    return []
def d():
    print ('D')
    return 1
def e():
    print ('E')
    return 1
    
if a() and b() and c() and d() and e():
    print ('ok')

python 從左至右先執行 a() ,a() 返回的邏輯值為 True,後面是 and 語句,所以不能短路其後,繼續與 b() 進行邏輯運算,a() and b() 輸出 b() 的邏輯值 True,接著與 c() 進行邏輯運算,b() and c() 輸出 c() 的邏輯值 False,而其後均為 and 語句, 則全部短路,最終只列印了 A B C 。


example 3

def a():
    print ('A')
    return 1
def b():
    print ('B')
    return 1
def c():
    print ('C')
    return []
def d():
    print ('D')
    return 1
def e():
    print ('E')
    return []
    
if a() or b() or c() or d() or e():
    print ('ok')


a() 的邏輯值為 True ,其後均為 or 語句,全部短路,最終只列印了 A,而 if 語句為 True ,所以還要列印一個 ok。


example 4

def a():
    print ('A')
    return []
def b():
    print ('B')
    return []
def c():
    print ('C')
    return 1
def d():
    print ('D')
    return []
def e():
    print ('E')
    return 1
    
if a() or b() or c() or d() or e():
    print ('ok')


python 從左至右先執行 a() ,a() 返回的邏輯值為 False,後面是 or 語句,所以不能短路其後,繼續與 b() 進行邏輯運算,a() or b() 輸出 b() 的邏輯值 False,接著與 c() 進行邏輯運算,b() or c() 輸出 c() 的邏輯值 True,而其後為 or 語句, 則全部短路,最終只列印了 A B C ok。

下面我們就來講一下 and 與 or 語句同時存在的情況:


example 5

def a():
    print ('A')
    return []
def b():
    print ('B')
    return []
def c():
    print ('C')
    return 1
def d():
    print ('D')
    return []
def e():
    print ('E')
    return 1
def f():
    print ('F')
    return 1
def g():
    print ('G')
    return []
def h():
    print ('H')
    return 1
if a() and b() and  c() and d() or e() and f() or g() and h():
    print ('ok')

  別以為語句很長就很難,我們好好分析一下,從左至右,首先a() 的邏輯值為 False,其後到 or 語句為止有三個 and 語句: a() and b() and c() and d(),均被短路。只輸出 a(), 得到 a() or e() 為True,輸出 e() ,得 e() and F() 為 True ,輸出 f(), 其後接 or 語句,則短路其後所有。最終只列印了A E F ok 。(結合上面的三點,慢慢分析)


三.  三元運算運算子

在python2.5 之前,python 是沒有三元運算子的,Guido Van Rossum 認為它並不能幫助 python 更加簡潔,但是那些習慣了 c 、 c++ 和 java 程式設計的程式設計師卻嘗試著用 and 或者 or 來模擬出三元運算子,而這利用的就是python的短路邏輯。

三元運算運算子 bool ? a : b ,若 bool 為真則 a ,否則為 b 。

轉化為 python 語言為:

bool and a or b

如何理解呢? 首先 a , b 都為真,這是預設的。如果 bool 為真, 則 bool and a 為真,輸出 a ,短路 b 。如果 bool 為假,短路 a,直接 bool or b ,輸出 b 。

換一種更簡單的寫法:

return a if bool else b


相關文章