文章目录

机缘巧合之下发现Python的orand运算后的返回值居然不是bool类型。

1
2
3
4
5
6
7
8
9
10
>>> 'yes' or 'no'
'yes'
>>> 0 or 1
1
>>> 'yes' and 'no'
'no'
>>> 1 and 0
0
>>> 0 and 1
0

显然,x and y and z and ...运算遇到第一个布尔值为的变量返回,如果没有则返回最后一个变量,
x or y or z or ...运算遇到第一个布尔值为的变量返回,如果没有也返回最后一个变量。

在我们的认知中,一般逻辑运算的结果就只有TrueFalse,而Python逻辑运算这样的特性对我们Python编程有什么样的影响呢?

在判断逻辑运算的结果方面,绝不能采用is True== True等判断方式(当然,这样也是十分不Pythonic的,相信这样干的人几乎没有吧)。

这样的特性还可以改写一些Python的三目运算,比如

1
2
3
4
5
6
7
a = b if b else c
# 可改写为
a = b or c

a = b if c else d
# 改写为
a = c and b or d # 这样改写的前提条件是b必须为真

同样,你也可以根据and运算返回特性简写一些代码,不赘述。

这个特性还可以很好解决一些代码风格问题,比如

一般来说,不推荐让listdict等这样的可变对象作为Python函数的默认参数,那么如果你想让这两个可变对象做参数默认值又不想违反这个代码风格要怎么办呢?

1
2
3
4
5
6
7
8
9
def func(arg=[]):
# do somethine
pass

# 改写后的函数
def func(arg=None):
arg = arg or []
# do somethine
pass

这样就充分解决了风格的统一问题,实际上类似这样利用Python逻辑运算返回值特性的写法,在Django代码中也有大量使用。

文章目录