原文: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。让我们看看一些例子:
这里我们使用 “and” 运算符来决定一个人是否可以被认为是鱿鱼游戏的玩家。
“and” 的两个操作数是变量 person_has_debt
和 person_willing_to_play
。由于这两个变量的值都是 True,所以 “and” 表达式的输出是 True,并且创建了一个新的 player 对象,我们指定了 player 名称和 player 编号。
现在,如果 person_willing_to_play
的值是 False 呢?
我们知道,只有当两个操作数都是 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。
操作数可以是算术或关系表达式(或两者的任何组合)、嵌套逻辑表达式,等等。
Python “or” 运算符
“or” 运算符也是一个二进制运算符,需要两个操作数。如果 “or” 表达式的任何一个操作数为 True,则其输出为 True,否则输出为 False。
operand1 or operand2
让我们看一些简单的例子:
这里 “or” 的操作数是方法 has_high_traffic
的输出,输入 "some_road_name"
和 "another_road_name"
。
为了简单起见,该方法随机返回 True 或 False。在第一次执行过程中,两个方法的调用都返回 False,“or” 运算评估为 False,因为两个操作数都是 False。
在第二次执行时,随机数现在是 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 如何计算该实体的真值。
Python 是如何计算真值的?
所有的逻辑运算符都与它们的操作数的真值一起运行——但究竟什么是真值?
我们知道,布尔类型的 True
代表真值,False
代表假值。Python 认为零是假值,所有其他的数字,不管是正数还是负数,都被认为是真值。
请看下面的例子:
Python 中实体的真值是在一些标准规则的基础上计算的,如这个链接的文档中的“真值测试”部分所定义。
所以,现在我们知道在下面的例子中,“not” 操作符是如何工作的:
空列表 []
的长度为零,所以真值判断为 False。零是假值,在这种情况下,反过来的值是真值。3 是真值,所以 not(3)
等同于 not(True)
,是假值。
逻辑运算符的短路
Python 中的逻辑 “and” 和 “or” 运算符是短路的,这意味着它们只评估得到正确结果所需的最低限度,例如:
if expression1 and expression2 and expression3:
#do something
else:
#do something else
如果 expression1
是假的,我们知道 and
的最终输出是假值。那么评估 expression2
和 expression3
是否有意义呢?不,这没有意义,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,就像下面这样:
现在让我们看看背后发生了什么。实际上,and
并不返回一个真或假的值。相反,它返回它的一个操作数。在这里的文档中提到了这一点,特别是这部分,引自文档。
(重要的例外:布尔运算or
和and
总是返回其操作数中的一个。)
operand1 and operand2
因此,如果 operand1
是假的,and
返回 operand1
,否则就返回 operand2
。 如果操作数是布尔类型的,那么就很容易理解。如果我们有如下的操作数,怎么办?
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
,正如我们在下面的片段中可以清楚地看到:
总结
在这篇文章中,我们学习了以下内容:
- Python 中不同的逻辑运算符,以及使用示例
- Python 如何计算实体的真值
- 什么是“短路”
- “and” 与 “or” 运算符在背后是怎样工作的
非常感谢你阅读本文。我希望你喜欢这篇文章并学到了一些与 Python 中逻辑运算符有关的有趣的知识。保重,编程愉快!