————《Python学习手册》读书笔记
在Python中:
- 任何非零数字或非空对象都为真
- 数字零、空对象以及特殊对象None都被认作是假
- 比较和相等测试会递归地应用在数据结构中
- 比较和相等测试会返回True或False(1和0的特殊版本)
- 布尔and和or运算符会返回真或假的操作对象
Python中有三种布尔表达式运算符:
- X and Y
- X or Y
- 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 运算也是类似。
考虑下列语句,根据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