python-布尔运算

                            ————《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

你可能感兴趣的:(python,python)