python 的逻辑值及其运算(python中逻辑量有哪些)
概述
bool 是 python 内建数据类型,其取值只有 True 和 False;python 的逻辑运算符有 not,and,or
看上去很简单,所以当我第一次看到下面的代码时我是懵逼的
id = item.get('id') or ''
作为一个主要使用 Java 的程序员来说,只有逻辑类型的变量才可以使用逻辑运算符,已经成了思维定式,对于 python,这些思维定式反而成了障碍
python 逻辑判断
python 的所有变量都可以进行逻辑比较,其中,如下变量的 bool 值总是 False
0, 0.0, [], {}, (), "", '', None, False
如何理解这个结论呢?
- None:总是 False,这是 python 语言特性
- 数值:对于数值 n,如果 n==0,那么 n 的 bool 值就是 False,反之为 True
- 对于集合/字符串/或其他类型 x,如果 len(x)==0,那么 x 的 bool 值就是 False,反之为 True
- 对于方法,其 bool 值总是 True,所以一定要注意,在逻辑表达式里不要忽略了方法的括号
- 自定义的类,其实例对象的 bool 值总是 True,如果想要改变,可以实现如下方法
- __bool__()
- __len__()
- 如果同时存在 __bool__(),__len__(),则 __bool()__ 优先
python 的 or 和 and 运算符
回到本文的开头,来看下 or 运算符
首先要明确一点:python 的 or 并不保证只返回 bool 值,即 True 或 False
or 运算有个短路特性,即遇到第一个 True 时就可以返回,不需要计算后续的表达式,而且它返回的是第一个为 True 的变量,并不一定是 True,比如说 1 也是 True,那么返回的就是 1,示例如下
>>> 0 or 1 or None or True
1
如果 or 没有发生短路,即计算到最后一个值还是没有遇到 True,那么会返回这最后的一个值,所以本文最初的代码,其含义如下
# 如果 item.id 是 None,则 id 值为 ''
id = item.get('id') or ''
这相当于给 id 一个默认值 '' 来避免其值为 None,因为对应的数据库字段可能不允许为 null
同样的,and 也有短路特性,它遇到第一个 False 就可以返回对应的变量,或者返回最后一个变量,示例如下
>>> 1 and {'x':1} and [] and True
[]
>>> 1 and True and [1,2] and [3,4]
[3, 4]
python 的 not
not 就比较特殊了,它返回的是 bool 值,即 True 或 False,示例如下
>>> not None
True
>>> not 100
False
>>> not [1]
False
>>> not {}
True
python 方法参与逻辑运算
python 的方法本身也是对象,可以赋值给变量
前面已经说了,方法的 bool 值总是 True,所以要小心,忘记给方法写上括号是会导致奇怪的问题的,排查起来很痛苦,示例如下
# 定义一个方法,总是返回 False
>>> def always_false():
... return False
# 预期打印出 bad
>>> x = always_false()
>>> if x:
... print('ok')
... else:
... print('bad')
...
bad
# 不慎没有写方法后的括号,导致运行错误
>>> x = always_false
>>> if x:
... print('ok')
... else:
... print('bad')
...
ok