——《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或其他语句中测试其结果,总会如预期的结果那样(每个对象的本质上不是真就是假)。

>>>2or3,3or2
(2,3)
>>>[]or3
3
>>>2and{}
{}
>>>[]and{}
[]

Python中,运算是短路计算。就or测试而言,Python会由左至右求算操作对象,然后返回第一个为真的操作对象,在找到的第一个真值操作数的地方停止。and

运算也是类似。

if/else三元表达式

考虑下列语句,根据X的真值把A设成Y或Z。

ifX:
A= Y
else:
A= Z

用四行代码编写似乎太浪费了。Python 2.5 引入了新的表达式格式,让我们可以在一个表达式中编写出相同的结果:

A= YifXelseZ

注意,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= ((XandY)orZ)

但有个问题:你得假定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.