Python的逻辑运算符and, or, and not (逻辑连接、分离、否定)

商业

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是最高的。

  1. not
  2. and
  3. 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)

和和或的返回值在下表中进行了总结。

xyx and yx or y
truefalseyx
falsetruexy
truetrueyx
falsefalsexy

短路(短路评估)

从上表可以看出,如果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