and or技巧

2.7. and-or 技巧

若是你是一名C語言高手,固然對 bool ? a : b 表達式熟悉,這個表達式當   bool 爲真時計算爲 a,其它值則爲 b。象不少編程技巧同樣,它是一種誘人的便利。你可在Python中完成一樣的事情,可是須要徹底理解它是如何工做的,以免不明顯的毛病。html

例 2.17. and-or 技巧python

a = "first"

>>> b = "second">>> 1 and a or b 'first'>>> 0 and a or b 'second'

1

這個語法看起來與C語言中的 bool ? a : b 類似。第一部分將在布爾環境中進行計算,它能夠是任意Python表達式。若是計算爲真,整個表達式的值爲         a。程序員

2 若是第一部分計算爲假,整個表達示的值爲 b。

然而,由於這個Python表達式是簡單的布爾邏輯,而不是一個特殊的語言結構,因此在這個Python的 and-or 技巧與C中的 bool   ? a : b 語法之間,有一個很是,很是,很是重要的不一樣。若是 a 的值爲假,表達式將不會按你指望的那樣執行。(你能知道我被這個問題折騰過嗎?不僅一次?)編程

例 2.18. 什麼時候 and-or 技巧失敗api

a = ""

>>> b = "second">>> 1 and a or b'second'

由於 a 是一個空串,空串在一個布爾環境中被Python當作假值,這個表達式將「失敗」,且返回 b 的值。若是你不將它想象成象   bool ? a : b 同樣的語法,而把它當作純粹的布爾邏輯,這樣的話就會獲得正確的理解。   1 是真,a 是假,因此 1 and a 是假。假 or b是 b。安全

Important
這個 and-or 技巧,bool       and a or b,當 a 爲假時,不會象C表達式 bool       ? a : b 同樣工做。

The real trick behind the and-or trick, then, is to make sure that the value of a is never false.  One common way of doing this is to turn a into [a] and b into [b], then taking the first element of the returned list, which will be either a or b.函數

Example 2.19. Using the and-or trick safelythis

a = ""

>>> b = "second">>> (1 and [a] or [b])[0]''

由於 [a] 是一個非空列表,它永遠不會爲假。甚至 a 是 0 或 ''或其它假值,列表 [a] 爲真,由於它有一個元素。code

到如今爲止,這個技巧可能看上去問題超過了它的價值。畢竟你能夠用一個 if 語句完成相同的事情,那麼爲何要經受這些麻煩呢?哦,在不少狀況下,要在兩個常量之間進行選擇,因此可使用更簡單的語法而沒必要擔憂,由於你知道   a 值將老是真。而且儘管你不得不使用更復雜的安全形式,也有一些好的理由來使用這個技巧;在Python中有不少時候, if語句不容許使用,這一點咱們將在下一節看到。htm

Note
一個負責的程序員應該將 and-or 技巧封裝成一個函數:
def choose(bool, a, b):

    return (bool and [a] or [b])[0]
相關文章
相關標籤/搜索