原文:Python Operator – Logical Operators in Python,作者:Suchandra Datta

任何编程语言中的运算符都是基本构件,我们可以用它来构造强大的、复杂的语句来解决问题。

Python 提供了不同类型的运算符,如算术运算符、逻辑运算符、关系运算符等等。在这篇文章中,让我们深入了解 Python 中的逻辑运算符并学习如何使用它们。

Python 提供三种逻辑或布尔运算符,“and”、“or” 和 “not” 运算符。这些运算符对一个或多个操作数起作用,并根据它们的值,评估为 True 或 False。然后在此基础上做出决定。

Python “and” 运算符

Python “and” 运算符是一个二进制运算符,这意味着它需要两个操作数。一般的语法看起来像这样:

operand1 and operand2

当且仅当操作数都是 True 时,输出为 True。如果任何一个操作数是 False,那么输出就是 False。让我们看看一些例子:

image-70

这里我们使用 “and” 运算符来决定一个人是否可以被认为是鱿鱼游戏的玩家。

“and” 的两个操作数是变量 person_has_debtperson_willing_to_play。由于这两个变量的值都是 True,所以 “and” 表达式的输出是 True,并且创建了一个新的 player 对象,我们指定了 player 名称和 player 编号。

现在,如果 person_willing_to_play 的值是 False 呢?

image-69

我们知道,只有当两个操作数都是 True 时,“and” 运算才能输出 True。如果其中任何一个是 False,则输出为 False,并且执行 else 子句中的语句。我们可以使用 “and” 来添加任意多的表达式,例如:

if person_has_debt and person_willing_to_play and proper_age and total_player_capacity_not_full:
    player_obj = SquidGamePlayer("Sae-byok", 67)
    player_obj.show_details()
else:
    print("Player not added to game")

从左到右评估操作数的真值,如果任何一个操作数是 False,则输出为 False,否则输出为 True。

操作数可以是算术或关系表达式(或两者的任何组合)、嵌套逻辑表达式,等等。

image-73

Python “or” 运算符

“or” 运算符也是一个二进制运算符,需要两个操作数。如果 “or” 表达式的任何一个操作数为 True,则其输出为 True,否则输出为 False。

operand1 or operand2

让我们看一些简单的例子:

image-74

这里 “or” 的操作数是方法 has_high_traffic 的输出,输入 "some_road_name""another_road_name"

为了简单起见,该方法随机返回 True 或 False。在第一次执行过程中,两个方法的调用都返回 False,“or” 运算评估为 False,因为两个操作数都是 False。

image-76

在第二次执行时,随机数现在是 1,所以方法调用 has_high_traffic("some_road_name") 返回 True。我们知道,如果 “or” 的任何一个操作数是 True,那么最后的输出也是 True。所以在这种情况下,“or” 表达式为 True,if 子句中的语句被执行。

你有没有注意到一件事?只有第一个方法调用被执行,而 has_high_traffic("another_road_name") 并没有被调用。为什么呢?这是由于一个叫做短路的东西,我们很快就会了解到。

Python “not” 操作符

“not” 是一个单项运算符,这意味着它只对一个操作数起作用,并返回该操作数的反转真值。

not ( operand )

简单地说,如果输入是 True,那么输出就是 False,如果输入是 False,那么输出就是 True。

当操作数直接为 bool 类型时,这很简单。然而,输入可以是数字类型、对象、列表等等。在这种情况下,输出取决于 Python 如何计算该实体的真值。

image-78

Python 是如何计算真值的?

所有的逻辑运算符都与它们的操作数的真值一起运行——但究竟什么是真值?

我们知道,布尔类型的 True 代表真值,False 代表假值。Python 认为零是假值,所有其他的数字,不管是正数还是负数,都被认为是真值。

请看下面的例子:

image-71
image-72

Python 中实体的真值是在一些标准规则的基础上计算的,如这个链接的文档中的“真值测试”部分所定义。

所以,现在我们知道在下面的例子中,“not” 操作符是如何工作的:

image-79

空列表 [] 的长度为零,所以真值判断为 False。零是假值,在这种情况下,反过来的值是真值。3 是真值,所以 not(3) 等同于 not(True),是假值。

逻辑运算符的短路

Python 中的逻辑 “and” 和 “or” 运算符是短路的,这意味着它们只评估得到正确结果所需的最低限度,例如:

if expression1 and expression2 and expression3:
	#do something
else:
	#do something else	

如果 expression1 是假的,我们知道 and 的最终输出是假值。那么评估 expression2expression3 是否有意义呢?不,这没有意义,Python 也不会这样做。它从左到右开始求值,只要一个表达式是 False,“and” 运算的结果就是 False,跳过其余操作数的执行。

同样的事情也发生在 “or” 运算符上:

if expression1 or expression2 or expression3:
	#do something
else:
	#do something else	

如果 expression1 是 True,那么 “or” 表达式的输出立即变成 True,而忽略其余的两个操作数。

这就节省了花在评估表达式上的不必要的时间,因为这些表达式的输出无论如何都不会影响表达式的最终输出。

关于 “and” 和 “or” 运算的补充说明

在这篇文章的开头,我提到当且仅当它的所有操作数都是 True 时,“and” 运算的输出是 True,否则输出是 False,就像下面这样:

image-82

现在让我们看看背后发生了什么。实际上,and 并不返回一个真或假的值。相反,它返回它的一个操作数。在这里的文档中提到了这一点,特别是这部分,引自文档。


(重要的例外:布尔运算 orand 总是返回其操作数中的一个。)
operand1 and operand2

因此,如果 operand1 是假的,and 返回 operand1,否则就返回 operand2。 如果操作数是布尔类型的,那么就很容易理解。如果我们有如下的操作数,怎么办?

image-80

operand1 是 12,是 True,operand2 是 56,也是 True,所以 and 返回 operand2,是56。

好的,但是这在条件语句中是如何工作的,比如在 if-else 中?请记住,56 也有一个真值,对吗?所以 and 的输出是 56,现在 56 的真值被用在 if-else 中。56 是真值,所以 if 句子被执行。

同样,我们还有 “or”,它也会返回它的一个操作数:

operand1 or operand2

如果 operand1 是 False,它就返回 operand2,否则就返回 operand1,正如我们在下面的片段中可以清楚地看到:

image-81

总结

在这篇文章中,我们学习了以下内容:

  • Python 中不同的逻辑运算符,以及使用示例
  • Python 如何计算实体的真值
  • 什么是“短路”
  • “and” 与 “or” 运算符在背后是怎样工作的

非常感谢你阅读本文。我希望你喜欢这篇文章并学到了一些与 Python 中逻辑运算符有关的有趣的知识。保重,编程愉快!