2011年11月11日 星期五

Python中,布爾值由左向右運算

<Python中,布爾值由左向右運算>
AND:
布爾環境中的所有值都為真,那麼and返回最後一個值
布爾環境中的某個值為假,則and返回第一個假值。

OR:
如果有一個值為真,or立刻返回該值
如果所有的值都為假,or返回最後一個假值。

<應用的實際例子>

 processFunc = collapse and ( lambda s: " " .join(s.split())) or ( lambda s: s)
processFunc現在是一個函數,但是它到底是哪一個函數還要取決於collapse變量。如果collapse為真,processFunc ( string )將壓縮空白;否則processFunc ( string )將返回未改變的參數。
collapse =1   -> ( lambda s: " " .join(s.split()))
collapse =0   -> ( lambda s: s)



4.6.  andor的特殊性質

Python中,andor執行布爾邏輯演算,如你所期待的一樣。但是它們並不返回布爾值,而是返回它們實際進行比較的值之一。

例4.15.  and介紹

>>> 'a'  and  'b'         1
'b' 
>>> ''  and  'b'          2
'' 
>>> 'a'  and  'b'  and  'c' 3
'c'
1使用and時,在布爾環境中從左到右演算表達式的值。0''[](){}None在布爾環境中為假;其它任何東西都為真。還好,幾乎是所有東西。默認情況下,布爾環境中的類實例為真,但是你可以在類中定義特定的方法使得類實例的演算值為假。你將會在第5章中了解到類和這些特殊方法。如果布爾環境中的所有值都為真,那麼and返回最後一個值。在這個例子中,and演算'a'的值為真,然後是'b'的演算值為真,最終返回'b'
2如果布爾環境中的某個值為假,則and返回第一個假值。在這個例子中,''是第一個假值。
3所有值都為真,所以and返回最後一個真值,'c'

例4.16.  or介紹

>>> 'a'  or  'b'          1
'a' 
>>> ''  or  'b'           2
'b' 
>>> ''  or [] or {}      3
{} 
>>> def sidefx (): 
...      print  "in sidefx()"
 ...      return 1 
>>> 'a'  or sidefx()     4
'a'
1使用or時,在布爾環境中從左到右演算值,就像and一樣。如果有一個值為真,or立刻返回該值。本例中,'a'是第一個真值。
2or演算''的值為假,然後演算'b'的值為真,於是返回'b'
3如果所有的值都為假,or返回最後一個假值。or演算''的值為假,然後演算[]的值為假,依次演算{}的值為假,最終返回{}
4注意or在布爾環境中會一直進行表達式演算直到找到第一個真值,然後就會忽略剩餘的比較值。如果某些值具有副作用,這種特性就非常重要了。在這裡,函數sidefx永遠都不會被調用,因為or演算'a'的值為真,所以緊接著就立刻返回'a'了。
如果你是一名C語言黑客,肯定很熟悉bool ? a : b表達式,如果bool為真,表達式演算值為a,否則為b基於Pythonandor的工作方式,你可以完成相同的事情。

4.6.1.使用and-or技巧


例4.17.  and-or技巧介紹

>>> a = "first"
 >>> b = "second"
 >>> 1 and a or b 1
'first' 
>>> 0 and a or b 2
'second'
1這個語法看起來類似於C語言中的bool ? a : b表達式。整個表達式從左到右進行演算,所以先進行and表達式的演算。1 and 'first'演算值為'first',然後'first' or 'second'的演算值為'first'
20 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         1
'second'
1由於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 ],然後使用返回值列表的第一個元素,應該是ab中的某一個。

例4.19.安全使用and-or技巧

>>> a = ""
 >>> b = "second"
 >>> (1 and [a] or [b])[0] 1
''
1由於a ]是一個非空列表,所以它決不會為假。即使a0或者''或者其它假值,列表a ]也為真,因為它有一個元素。
到現在為止,這個技巧可能看上去問題超過了它的價值。畢竟,使用if 語句可以完成相同的事情,那為什麼要經歷這些麻煩事呢?哦,在很多情況下,你要在兩個常量值中進行選擇,由於你知道a的值總是為真,所以你可以使用這種較為簡單的語法而且不用擔心。對於使用更為複雜的安全形式,依然有很好的理由要求這樣做。例如,在Python語言的某些情況 ​​下if語句是不允許使用的,比如在lambda函數中。

進一步閱讀

沒有留言:

張貼留言