3小时入门Python——第十四课布尔逻辑
布尔型
布尔类型,或者简单地 bool
,是仅具有两个可能的值的特殊数据类型:True
和 False
。在 Python 中,布尔值的名称以大写字母开头。
在编程语言中,布尔类型或逻辑类型是表示只有两种相反状态(例如_打开_或_关闭_,_是_或_否_等)的一种常见方式 。
如果您正在编写跟踪门 bool
的打开状态的应用程序,那么会发现使用它来存储当前的门状态是很自然的。
is_open = True
is_closed = False
print(is_open) # True
print(is_closed) # False
布尔运算
有三个内置的布尔运算符在 Python: and
,or
和 not
。前两个是二进制运算符,这意味着它们需要两个参数。not
是一 元运算符,它始终应用于单个操作数。首先,让我们看一下这些应用于布尔值的运算符。
- 并且是二进制运算符,它接受两个参数,
True
如果两个参数都为 true,则返回,否则返回False
。a = True and True # True b = True and False # False c = False and False # False d = False and True # False - 或是二进制运算符,
True
如果至少一个参数为 true,则返回,否则返回False
。a = True or True # True b = True or False # True c = False or False # False d = False or True # True - not 是一元运算符,它会反转其参数的布尔值。to_be = True # to_be is True not_to_be = not to_be # not_to_be is False
布尔运算的优先级
逻辑运算符的优先级不同,它影响评估的顺序。下面是运营商在他们的优先级顺序:not
,and
,or
。因此,not
首先考虑的,不是 and
最后 or
。考虑到这一点,请考虑以下表达式:
print(False or not False) # True
首先,对零件 not False
进行评估,评估后,剩下 False or True
。这导致 True
,如果你还记得上一节。
虽然只用布尔值处理似乎是显而易见的,逻辑运算符的优先级将是非常重要的,当你开始用所谓的工作记忆 truthy 和 falsy 值。
真实和虚假的价值观
尽管 Python 具有布尔数据类型,但我们经常想在逻辑上下文中使用非布尔值。Python 使您可以测试几乎所有对象的真实性。与逻辑运算符一起使用时,非布尔类型的值(例如整数或字符串)称为 true 或 falsy。这取决于它们是否被解释为 True
或 False
。
以下值 False
在 Python 中评估为 :
- 常数定义为假:
None
和False
, - 任何数值类型的零:
0
,0.0
, - 空序列和容器:
""
,[]
,{}
。
一般而言,其他任何评估 True
。这是几个示例:
print(0.0 or False) # False
print(False and "") # False
一般来说,and
并且 or
可以采用可以测试布尔值的任何参数。
现在,我们可以更清楚地说明运算符优先级的不同:
# `and` has a higher priority than `or`
truthy_integer = False or 5 and 100 # 100
同样,让我们将上面的表达式分成几部分。由于运算符 and
的优先级高于 or
,因此我们应该看一下该 5 and 100
部分。双方 100
并 5
恰巧是 truthy 值,因此该操作将返回 100
。您以前从未见过,所以很自然地想知道为什么我们这里有一个数字而不是 True
值。我们很快将介绍这个令人惊讶的事实。回到原始表达式,您可以看到最后一部分 False or 100
做的完全一样,返回 100
而不是 True
。
运算符 or
和 and
返回其操作数之一,不一定是布尔类型。尽管如此, not
始终返回布尔值。
下面是另一个棘手的示例:
tricky = not (False or '') # True
一对括号是指定操作执行顺序的一种方式。因此,我们首先评估表达式的这一部分:False or ''
。此操作数 ''
求值 False
并 or
返回此空字符串。由于封闭表达式的结果取反,因此我们得出 True
:not ''
与相同 True
。为什么我们没有得到非空字符串?在 not
操作创建一个新的值,默认情况下具有布尔类型。因此,如前所述,一元运算符始终返回逻辑值。
短路评估
最后要提到的是 Python 中的逻辑运算符是短路的。这就是为什么它们也被称为 lazy。这意味着仅当第一个操作数不足以评估整个表达式时,才对此类表达式中的第二个操作数求值。
x and y
退货 X 如果 X 虚假 否则,它将评估并返回ÿ。x or y
退货 X 如果 X 是真的 否则,它将评估并返回ÿ。
例如:
# division is never evaluated, because the first argument is True
lazy_or = True or (1 / 0) # True
# division is never evaluated, because the first argument is False
lazy_and = False and (1 / 0) # False
这些是 Python 中布尔值和逻辑运算的基础。从一开始就认识他们绝对是一件好事!