Python中的and和or

python中的and和orpython

4.6. and 和 or 的特殊性質
在Python 中,and 和 or 執行布爾邏輯演算,如你所期待的同樣,可是它們並不返回布爾值;而是,返回它們實際進行比較的值之一。安全


例 4.15. and 介紹
>>> 'a' and 'b'        ide

'b'函數

>>> '' and 'b'         字符串

''lambda

>>> 'a' and 'b' and 'c'技巧

'c'語法


使用 and 時,在布爾上下文中從左到右演算表達式的值。0、''、[]、()、{}、None 在布爾上下文中爲假;其它任何東西都爲真。還好,幾乎是全部東西。默認狀況下,布爾上下文中的類實例爲真,可是你能夠在類中定義特定的方法使得類實例的演算值爲假。你將會在第 5 章中瞭解到類和這些特殊方法。若是布爾上下文中的全部值都爲真,那麼 and 返回最後一個值。在這個例子中,and 演算 'a' 的值爲真,而後是 'b' 的演算值爲真,最終返回 'b'。 
若是布爾上下文中的某個值爲假,則 and 返回第一個假值。在這個例子中,'' 是第一個假值。 
全部值都爲真,因此 and 返回最後一個真值,'c'。方法


例 4.16. or 介紹
>>> 'a' or 'b'         黑客

'a'

>>> '' or 'b'          

'b'

>>> '' or [] or {}     

{}

>>> def sidefx():

...     print "in sidefx()"

...     return 1

>>> 'a' or sidefx()    

'a'
使用 or 時,在布爾上下文中從左到右演算值,就像 and 同樣。若是有一個值爲真,or 馬上返回該值。本例中,'a' 是第一個真值。 
or 演算 '' 的值爲假,而後演算 'b' 的值爲真,因而返回 'b' 。 
若是全部的值都爲假,or 返回最後一個假值。or 演算 '' 的值爲假,而後演算 [] 的值爲假,依次演算 {} 的值爲假,最終返回 {} 。 
注意 or 在布爾上下文中會一直進行表達式演算直到找到第一個真值,而後就會忽略剩餘的比較值。若是某些值具備反作用,這種特性就很是重要了。在這裏,函數 sidefx 永遠都不會被調用,由於 or 演算 'a' 的值爲真,因此緊接着就馬上返回 'a' 了。

若是你是一名 C 語言黑客,確定很熟悉 bool ? a : b 表達式,若是 bool 爲真,表達式演算值爲 a,不然爲 b。基於 Python 中 and 和 or 的工做方式,你能夠完成相同的事情。

4.6.1. 使用 and-or 技巧

例 4.17. and-or 技巧介紹
>>> a = "first"

>>> b = "second"

>>> 1 and a or b

'first'

>>> 0 and a or b

'second'
這個語法看起來相似於 C 語言中的 bool ? a : b 表達式。整個表達式從左到右進行演算,因此先進行 and 表達式的演算。 1 and 'first' 演算值爲 'first',而後 'first' or 'second' 的演算值爲 'first'。 
0 and 'first' 演算值爲 False,而後 0 or 'second' 演算值爲 'second'。

然而,因爲這種 Python 表達式單單只是進行布爾邏輯運算,並非語言的特定構成,這是 and-or 技巧和 C 語言中的 bool ? a : b 語法很是重要的不一樣。若是 a 爲假,表達式就不會按你指望的那樣工做了。(你能知道我被這個問題折騰過嗎?不僅一次?)


例 4.18. and-or 技巧無效的場合
>>> a = ""

>>>b = "second"

>>> 1 and a or b        

'second'
因爲 a 是一個空字符串,在 Python 的布爾上下文中空字符串被認爲是假的,1 and '' 的演算值爲 '',最後 '' or 'second' 的演算值爲 'second'。噢!這個值並非你想要的。

and-or 技巧,bool and a or b 表達式,當 a 在布爾上下文中的值爲假時,不會像 C 語言表達式 bool ? a : b 那樣工做。

在 and-or 技巧後面真正的技巧是,確保 a 的值決不會爲假。最經常使用的方式是使 a 成爲 [a] 、 b 成爲 [b],而後使用返回值列表的第一個元素,應該是 a 或 b中的某一個。


例 4.19. 安全使用 and-or 技巧
>>> a = ""

>>> b = "second"

>>> (1 and [a] or [b])[0]

''
因爲 [a] 是一個非空列表,因此它決不會爲假。即便 a 是 0 或者 '' 或者其它假值,列表 [a] 也爲真,由於它有一個元素。

到如今爲止,這個技巧可能看上去問題超過了它的價值。畢竟,使用 if 語句能夠完成相同的事情,那爲何要經歷這些麻煩事呢?哦,在不少狀況下,你要在兩個常量值中進行選擇,因爲你知道 a 的值老是爲真,因此你可使用這種較爲簡單的語法並且不用擔憂。對於使用更爲複雜的安全形式,依然有很好的理由要求這樣作。例如,在 Python 語言的某些狀況下 if 語句是不容許使用的,好比在 lambda 函數中。

注:這裏因爲語句是從左向右解釋的。咱們能夠這樣的來理解。
and語句:
0and* 不須要再考慮*是0仍是1,結果是0
1and* 須要考慮*是0仍是1來決定結果。

1or* 不須要考慮後面的*,結果爲1 0or* 須要考慮後面的*來決定結果

相關文章
相關標籤/搜索