python-布林運算

damant發表於2015-07-17
                            ————《Python學習手冊》讀書筆記

真值測試

在Python中:

  1. 任何非零數字或非空物件都為真
  2. 數字零、空物件以及特殊物件None都被認作是假
  3. 比較和相等測試會遞迴地應用在資料結構中
  4. 比較和相等測試會返回True或False(1和0的特殊版本)
  5. 布林and和or運算子會返回真或假的操作物件

Python中有三種布林表示式運算子:

  1. X and Y
  2. X or Y
  3. not X

值比較會返回True或False作為其真值結果(其實是整數1和0的特殊版本,列印時不同但其實完全一樣)。接下來看一些例子:

>>> 2<3,3<2
(True, False)

另一方面,and 和 or運算子總會返回物件(不是運算子左側的物件就是右側的物件),而不是值True或False。如果我們在if或其他語句中測試其結果,總會如預期的結果那樣(每個物件的本質上不是真就是假)。

>>> 2 or 3,3 or 2
(2, 3)
>>> [] or 3
3
>>> 2 and {}
{}
>>> [] and {}
[]

Python中,運算是短路計算。就or測試而言,Python會由左至右求算操作物件,然後返回第一個為真的操作物件,在找到的第一個真值運算元的地方停止。and 運算也是類似。

if/else三元表示式

考慮下列語句,根據X的真值把A設成Y或Z。

if X:
    A = Y
else:
    A = Z

用四行程式碼編寫似乎太浪費了。Python 2.5 引入了新的表示式格式,讓我們可以在一個表示式中編寫出相同的結果:

A = Y if X else Z

注意,Python的X if Y else Z 和C的Y?X:Z的順序有點不同。下面看一些例子:

>>> A = 't' if 'spam' else 'f'
>>> A
't'
>>> A = 't' if '' else 'f'
>>> A
'f'

事實上,相同的效果可以小心地用and和or運算子的結合實現,因為它們不是返回左邊的物件就是返回右邊的物件:

A = ((X and Y) or Z)

但有個問題:你得假定Y是布林真值。如果是這樣,效果就相同。
此外,使用下列表示式也是類似的,因為bool函式會把X轉化成對應的整數1或0:

A = [Z,Y][bool(X)]

然而,這並不完全相同,因為這樣不會做短路運算,無論X值是什麼,總是會執行Z和Y。


damant
The quieter you become,the more you are able to hear.
北京
2015-7-17

相關文章