Python布尔类型是Python的内置数据类型之一。它用来表示表达式的真实值。例如,表达式1<=2为True,而表达式0==1为False。了解Python布尔值的行为对于在Python中良好编程是非常重要的。
Python布尔类型
Python布尔类型只有两个可能的值:
True
False
没有其他值的类型为bool。可以使用内置方法type()检查True和False的类型:
>>> type(False)
>>> type(True)
用type()测试False和True的都是bool。
bool是内置类型,在Python中使用不需要导入。然而名字本身并不是语言中的关键字,虽然以下被认为是错误的写法,但可以将其指定给bool名称:
>>> bool
>>> bool = "this is not a type"
>>> bool
'this is not a type'
虽然技术上可行,但为了避免混淆,强烈建议不要为bool指定不同的值。
Python布尔值作为关键字
内置名称不是关键字。就Python语言而言,它们是常规变量。如果指定给它们,则将覆盖内置值。
相比之下,True和False两个名字并不是内置,它们是关键词。与许多其他Python关键字不同,True和False是Python表达式。因为它们是表达式,所以可以在任何可以使用其他表达式(如1+1)的地方使用它们。
可以为变量分配布尔值,但不能将值赋给True:
>>> a_true_alias
True
>>> True = 5
File "", line 1
SyntaxError: cannot assign to True
因为True是一个关键字,所以不能给它赋值。同样的规则适用于False:
>>> False = 5
File "", line 1
SyntaxError: cannot assign to False
不能指定为False,因为它是Python中的关键字。这样,True和False的行为与其他数值常量类似。例如,可以将1.5传递给函数或将其分配给变量。但是不可能将值赋给1.5。语句1.5=5不是有效的Python代码。1.5=5和False=5都是无效的Python代码,解析时将引发语法错误。
Python布尔值作为数字
在Python中布尔值被认为是一种数值类型。这就表面它们是数字,您可以将算术运算应用于布尔值,还可以将其与数字进行比较:
>>> True == 1
True
>>> False == 0
True
>>> True + (False / True)
1.0
布尔值的数值特性没有很多用途,但是有一种技术可能会对您有所帮助。因为True等于1,False等于0,所以将布尔值相加是一种快速计算真值数量的方法。当您需要计算满足某个条件的项数时,这会很方便。
例如,如果你想分析一首经典儿童诗中的一句话,看看哪一行包含了“the”这个词,那么“真”等于1,“假”等于0这一事实很有用:
>>> lines="""\
... He took his vorpal sword in hand;
... Long time the manxome foe he sought—
... So rested he by the Tumtum tree
... And stood awhile in thought.
... """.splitlines()
>>> sum("the" in line.lower() for line in lines) / len(lines)
0.5
将生成器表达式中的所有值相加可以知道True在生成器中出现的次数。生成器中True的次数等于包含单词“The”的行数,不区分大小写。用这个数除以行总数,就得到了匹配行数与总行数的比率。
要了解这一点的原因,可以将上面的代码拆分成更小的部分:
>>> lines = """\
... He took his vorpal sword in hand;
... Long time the manxome foe he sought—
... So rested he by the Tumtum tree
... And stood awhile in thought.
... """
>>> line_list = lines.splitlines()
>>> "the" in line_list[0]
False
>>> "the" in line_list[1]
True
>>> 0 + False + True # Equivalent to 0 + 0 + 1
1
>>> ["the" in line for line in line_list]
[False, True, True, False]
>>> False + True + True + False
2
>>> len(line_list)
4
>>> 2/4
0.5
ine_list变量保存一个行列表。第一行中没有单词“The”,所以“The”在第line_list[0]中为False。在第二行中,“the”出现了,因此第[1]行中的“the”为真。因为布尔值是数字,你可以把它们加到数字中,0+False+True得到1。
因为[“the”in line for line in line_list]是由四个布尔值组成的列表,所以可以将它们相加。加上False+True+True+False,得到2。现在,如果将结果除以4,即列表的长度,得到0.5。单词“The”出现在所选内容的一半行中。这是一种利用布尔值是数字这一事实的有用方法。
布尔算子
布尔运算符是那些接受布尔输入并返回布尔结果的运算符。
因为Python布尔值只有两个可能的选项,True或False,所以可以根据操作符分配给每个可能的输入组合的结果来完全指定操作符。这些规范称为真值表,因为它们显示在表中。
正如您稍后将看到的,在某些情况下,知道运算符的一个输入就足以确定其值。在这些情况下,不评估其他输入。这称为短路评估。
短路评估的重要性取决于具体案例。在某些情况下,它可能对您的程序几乎没有影响。在其他情况下,例如当计算不影响结果的表达式时,它提供了显著的性能优势。在最极端的情况下,代码的正确性取决于短路评估。
无输入的运算符
您可以将True和False视为不接受输入的布尔运算符。其中一个运算符始终返回True,另一个运算符始终返回False。
将Python布尔值看作运算符有时很有用。例如,这种方法有助于提醒您它们不是变量。由于同样的原因,你不能分配给+,这是不可能分配给真或假。
只存在两个Python布尔值。没有输入的布尔运算符总是返回相同的值。因此,True和False是唯一两个不接受输入的布尔运算符。
非布尔运算符
唯一有一个参数的布尔运算符不是。它接受一个参数并返回相反的结果:False表示True,True表示False。这是真相表:
A
not A
True
False
False
True
此表说明not返回参数的相反真值。因为not只需要一个参数,所以它不会短路。它在返回结果之前对其参数求值:
>>> not True
False
>>> not False
True
>>> def print_and_true():
... print("I got called")
... return True
...
>>> not print_and_true()
I got called
False
最后一行显示not在返回False之前对其输入求值。
您可能想知道为什么没有其他布尔运算符接受单个参数。为了理解原因,您可以查看一个表,其中显示了所有理论上可能采用一个参数的布尔运算符:
A
not A
Identity
Yes
No
True
False
True
True
False
False
True
False
True
False
只有四个可能的运算符具有一个参数。除此之外,其余三个运算符都有一些异想天开的名称,因为它们实际上并不存在:
Identity:由于此运算符只返回其输入,所以您可以将其从代码中删除而不会产生任何效果。
Yes:这是一个短路运算符,因为它不依赖于它的参数。你可以用True替换它,得到同样的结果。
No:这是另一个短路运算符,因为它不依赖于它的参数。你可以用False替换它,得到同样的结果。
另一个运算符可能没有任何用处。