逻辑运算符
逻辑运算符有三种:and、or、not(三者都是关键字),也就是与、或、非。
x and y # 当x和y均为True时,此逻辑表达式为True,否则为False
x or y # 当x和y之中至少有1个为True时,表达式结果位True,否则为False
not x # 当x为True时,表达式结果为False;当x为False时,表达式结果为True
逻辑运算符常与比较运算符一起使用。
print("2 > 1 and 3 <= 2 is {}.".format(2 > 1 and 3 <= 2))
print("2 > 1 or 3 <= 2 is {}.".format(2 > 1 or 3 <= 2))
运行结果为:
2 > 1 and 3 <= 2 is False.
2 > 1 or 3 <= 2 is True.
任何类型的值天生都具有布尔属性(True或False),这一点在逻辑表达式中得以体现。
print("not '' is {}.".format(not '')) # 空字符串
print("not 0.0 is {}.".format(not 0.0))
print("not 0 is {}.".format(not 0))
print("not False is {}".format(not False))
print("not 2 is {}.".format(not 2))
print("not '*****' is {}.".format(not '*****'))
运行结果为:
not '' is True.
not 0.0 is True.
not 0 is True.
not False is True
not 2 is False.
not '*****' is False.
可见,0的布尔属性是False,2的布尔属性是True。
整数0、浮点数0.0、空字符串“”(‘’、‘’‘’‘’)、布尔值Flase的布尔属性均为False,这四种类型的其他值的布尔属性均为True。
注意:只有空格的字符串不是空字符串。
print("0 or 0.0 or '' or False is {}.".format(0 or 0.0 or '' or False))
运行结果为:
0 or 0.0 or '' or False is False.
可见,四者的布尔属性确实皆为False。
上面的例子用到了逻辑运算符的复合形式,即一个表达式中有多个逻辑运算符。
如果使用具体变量直接进行逻辑运算,结果会保留变量的原来面貌,如下例:
print(3 and 1.5)
print(3 or 1.5)
print(0 and 1.5)
print(0 or 1.5)
运行结果为:
1.5
3
0
1.5
第3个表达式为False,其余全为True,这与结果的布尔属性相符。但是,第一个表达式结果是1.5,而第二个表达式结果为3,这是为什么呢?这里有必要介绍一下短路机制。
短路机制
在进行与运算时,如果and的左值的布尔属性为False,那就不必再计算右值了(肯定为假),直接返回左值即可(短路机制生效,参考上面例子的第三个表达式);如果and的左值的布尔属性为True,必须接着计算右值,然后返回右值(参考第一个表达式)。
在进行或运算时,如果or的左值的布尔属性为False,必须接着计算右值,然后返回右值(参考第四个表达式);如果or的左值的布尔属性为True,那就不必再计算右值了(肯定为真),直接返回左值即可(短路机制生效,参考第二个表达式)。
通过下面的例子,可以更直观体会短路机制。
print('left' and 'middle' and 'right')
print('left' or 'middle' or 'right')
运行结果为:
right
left