天天看點

Python中的and和or

python中的and和or

4.6. and 和 or 的特殊性質

在Python 中,and 和 or 執行布爾邏輯演算,如你所期待的一樣,但是它們并不傳回布爾值;而是,傳回它們實際進行比較的值之一。

例 4.15. and 介紹

>>> 'a' and 'b'        

'b'

>>> '' and 'b'         

''

>>> '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'          

>>> '' or [] or {}     

{}

>>> def sidefx():

...     print "in sidefx()"

...     return 1

>>> 'a' or sidefx()    

使用 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        

由于 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 技巧

>>> (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* 需要考慮後面的*來決定結果

注:終于把這點弄懂了,在别人的部落格上看的,轉過來,跟大家分享一下

上一篇: 二進制
下一篇: python中的鎖