Python提供了逻辑运算符来进行逻辑(布尔)运算。(and
,or
,not
)
它用于描述if语句中多个条件之间的关系。
本节介绍以下内容。
- 交叉点:
and
- 逻辑性添加:
or
- 否认:
not
and
,or
,not
操作员优先级
此外,以下几点作为注意事项加以说明。
- 用于除bool以外类型的对象的逻辑运算符
and
,or
这些返回值不一定是bool类型的。- 短路(短路评估)
交叉点: and
并返回两个值的逻辑乘积。
print(True and True)
# True
print(True and False)
# False
print(False and True)
# False
print(False and False)
# False
事实上,它经常不是用于真或假,而是用于使用比较运算符的条件表达式。供你参考,比较运算符如下。
<
>
a = 10
print(0 < a)
# True
print(a < 100)
# True
print(0 < a and a < 100)
# True
并可串联如下。
print(0 < a < 100)
# True
逻辑性添加: or
或返回两个值的逻辑OR。
print(True or True)
# True
print(True or False)
# True
print(False or True)
# True
print(False or False)
# False
否认: not
not “返回值的否定值;真和假是相反的。
print(not True)
# False
print(not False)
# True
and,or,not操作员优先级
这些逻辑运算符的优先顺序如下:not是最高的。
not
and
or
在下面的示例代码中,上面的表达式被解释为好像是下面的表达式。由于额外的括号没有问题,在像这个例子的情况下,可能更容易清楚地描述它们。
print(True or True and False)
# True
print(True or (True and False))
# True
如果你想在and之前操作or,请使用括号()。
print((True or True) and False)
# False
<
,>
这些比较运算符的优先级甚至高于非优先级。因此,每个比较操作都不需要用括号,就像上面的例子那样。
print(0 < a and a < 100)
# True
关于Python中操作符优先级的总结,请看下面的官方文档。
用于除bool以外类型的对象的逻辑运算符
有了这些逻辑运算符,不仅是bool类型(真、假),还有数字、字符串、列表等都可以作为布尔值来处理。
以下对象在Python的逻辑运算中被认为是假的。
- 定义为假的常量:
None
,false
- 数字类型中的零:
0
,0
,0j
,Decimal(0)
,Fraction(0, 1)
- 空的序列或集合:
''
,()
,[]
,{}
,set()
,range(0)
所有其他值都被认为是真的。
函数bool()可以用来获取一个对象的布尔值。注意,字符串'0'或'False'被认为是真的。
print(bool(10))
# True
print(bool(0))
# False
print(bool(''))
# False
print(bool('0'))
# True
print(bool('False'))
# True
print(bool([]))
# False
print(bool([False]))
# True
要将字符串中的'0'或'false'处理为假,请使用distutils.util.strtobool()。
and,or这些返回值不一定是bool类型的。
下面是一个不是bool类型的对象的例子,显示了每个运算符在数字值上的结果。
x = 10 # True
y = 0 # False
print(x and y)
# 0
print(x or y)
# 10
print(not x)
# False
从上面的例子可以看出,Python 中的 and 和 or 并不返回 bool 类型的真或假,而是根据真或假返回左边或右边的值。这个例子是数字型的,但同样适用于其它类型,如字符串和列表。顺便说一下,not 返回 bool 类型的真或假。
和和或的返回值的定义如下。
The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.
The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.
6.11. Boolean operations — Expressions — Python 3.10.1 Documentation
当左右表达式的值分别为真和假时,返回值很容易理解。另一方面,如果两者都是真或都是假,则返回值会因顺序不同而不同。
如果你把它作为if语句中的条件表达式等使用,其结果会被判断为布尔值并进行处理,所以你不需要担心,但如果你使用返回值进行进一步处理,你需要小心。
x = 10 # True
y = 100 # True
print(x and y)
# 100
print(y and x)
# 10
print(x or y)
# 10
print(y or x)
# 100
x = 0 # False
y = 0.0 # False
print(x and y)
# 0
print(y and x)
# 0.0
print(x or y)
# 0.0
print(y or x)
# 0
print(bool(x and y))
# False
如果你想把它当作真或假,你可以像上一个例子那样做。bool(x and y)
和和或的返回值在下表中进行了总结。
x | y | x and y | x or y |
---|---|---|---|
true | false | y | x |
false | true | x | y |
true | true | y | x |
false | false | x | y |
短路(短路评估)
从上表可以看出,如果x在x和y中为假,或者x在x或y中为真,无论y的值是多少,返回值都是x。
在这种情况下,y不会被评估。
and
,or
请注意,如果你在这些进程的右侧调用一个函数或方法来做一些处理,该进程可能不会被执行,这取决于左侧的结果。
def test():
print('function is called')
return True
print(True and test())
# function is called
# True
print(False and test())
# False
print(True or test())
# True
print(False or test())
# function is called
# True