短路逻辑规则如下:
- 表达式从左至右运算,若or的左侧逻辑值为True,则短路 or 后所有的表达式(不管是and还是or),==直接输出or左侧表达式==。若or的左侧逻辑值为False,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
- 表达式从左至右运算,若and的左侧逻辑值为False,则短路其后所有and表达式,==直到有or出现,输出and左侧表达式到or的左侧==,参与接下来的逻辑运算。若and的左侧逻辑值为True,则输出其后的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
- 若or的左侧为False,或者and的左侧为True则不能使用短路逻辑。
==注意:==
- 在Python中and的优先级是大于or的,而且and和or都是会返回值的并且不转换为True和False。当not和and以及or在一起运算时,优先级为是not>and>or
- 在Python中,None、任何数值类型中的0、空字符串“”、空元组()、空列表[]、空字典{}都被当做False,还有自定义类型,如果实现了
__nonzero__()或__len__()方法且方法返回0或False,则其实例也被当做False,其他对象均为True。
Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:
| 运算符 | 逻辑表达式 | 描述 | 实例 |
|---|---|---|---|
| and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则它返回 y 的计算值。 | (a and b) 返回 20。 |
| or | x or y | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
| not | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
==result = x < y and x or y==
首先判断条件x小于y的真假,
如果为真 and 会返回 x,然后计算x or y;
如果为假,and返回 False,然后计算False or y一定是返回y的。
如下示例有助于理解短路逻辑的原理:
0 and 2 # 表达式从左至右运算,若and的左侧逻辑值为False,则短路其后所有and表达式
# 0
[] and 2 # 表达式从左至右运算,若and的左侧逻辑值为False,则短路其后所有and表达式
# []
2 and {} # 表达式从左至右运算,若and的左侧逻辑值True,则输出其后的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
# {}
[] and {} # 表达式从左至右运算,若and的左侧逻辑值为False,则短路其后所有and表达式
# []
2 and 5 # 表达式从左至右运算,若and的左侧逻辑值True,则输出其后的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
# 5
5 and 2 # 表达式从左至右运算,若and的左侧逻辑值True,则输出其后的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
# 2
0 or 2 # 表达式从左至右运算,若or的左侧逻辑值为False,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
# 2
2 or [] # 表达式从左至右运算,若or的左侧逻辑值为True,则短路 or 后所有的表达式(不管是and还是or),直接输出or左侧表达式。
# 2
False or 5 # 表达式从左至右运算,若or的左侧逻辑值为False,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
# 5
[] or {} # 表达式从左至右运算,若or的左侧逻辑值为False,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
# {}
{} or False or [] # 表达式从左至右运算,若or的左侧逻辑值为False,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
# []