内容纲要
概述
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
Java 程序员学 python:逻辑值及其运算