| 導航:起始頁 > Dive Into Python > 自省的威力 > and 和 or 的特殊性質 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
在Python 中,and 和 or 執行布爾邏輯演算,如你所期待的一樣。但是它們并不返回布爾值,而是返回它們實際進行比較的值之一。
>>> 'a' and 'b''b' >>> '' and 'b'
'' >>> 'a' and 'b' and 'c'
'c'
| 使用 and 時,在布爾環境中從左到右演算表達式的值。0、''、[]、()、{}、None 在布爾環境中為假;其它任何東西都為真。還好,幾乎是所有東西。默認情況下,布爾環境中的類實例為真,但是你可以在類中定義特定的方法使得類實例的演算值為假。你將會在第 5 章中了解到類和這些特殊方法。如果布爾環境中的所有值都為真,那么 and 返回最后一個值。在這個例子中,and 演算 'a' 的值為真,然后是 'b' 的演算值為真,最終返回 'b'。 | |
| 如果布爾環境中的某個值為假,則 and 返回第一個假值。在這個例子中,'' 是第一個假值。 | |
| 所有值都為真,所以 and 返回最后一個真值,'c'。 |
>>> 'a' or 'b''a' >>> '' or 'b'
'b' >>> '' or [] or {}
{} >>> def sidefx(): ... print "in sidefx()" ... return 1 >>> 'a' or sidefx()
'a'
如果你是一名 C 語言黑客,肯定很熟悉 bool ? a : b 表達式,如果 bool 為真,表達式演算值為 a,否則為 b。基于 Python 中 and 和 or 的工作方式,你可以完成相同的事情。
>>> a = "first" >>> b = "second" >>> 1 and a or b'first' >>> 0 and a or b
'second'
然而,由于這種 Python 表達式單單只是進行布爾邏輯運算,并不是語言的特定構成,這是 and-or 技巧和 C 語言中的 bool ? a : b 語法非常重要的不同。如果 a 為假,表達式就不會按你期望的那樣工作了。(你能知道我被這個問題折騰過嗎?不止一次?)
and-or 技巧,也就是 bool and a or b 表達式,當 a 在布爾環境中的值為假時,不會像 C 語言表達式 bool ? a : b 那樣工作。
在 and-or 技巧后面真正的技巧是,確保 a 的值決不會為假。最常用的方式是使 a 成為 [a] 、 b 成為 [b],然后使用返回值列表的第一個元素,應該是 a 或 b中的某一個。
到現在為止,這個技巧可能看上去問題超過了它的價值。畢竟,使用 if 語句可以完成相同的事情,那為什么要經歷這些麻煩事呢?哦,在很多情況下,你要在兩個常量值中進行選擇,由于你知道 a 的值總是為真,所以你可以使用這種較為簡單的語法而且不用擔心。對于使用更為復雜的安全形式,依然有很好的理由要求這樣做。例如,在 Python 語言的某些情況下 if 語句是不允許使用的,比如在 lambda 函數中。
<< 過濾列表 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
使用 lambda 函數 >> |