布尔型(Boolean,首字母大写)以发明布尔代数的英国数学家乔治·布尔(George Boole)命名,它通常只有两个值:True(真)与False(假),用于非此即彼的逻辑判断,以一个字节存储于内存中,是绝大数编程语言中最简单的数据类型。
在编程语言中,逻辑运算通常也称为布尔运算,布尔运算的结果称为布尔值,布尔变量用来存储布尔值。如下所示:
variable1 = True
variable2 = False
variable3 = variable1 + variable2
print(variable3)
一、布尔值
True与False都为Python关键字,不能用作标识符(如变量名),作为布尔值时,其首字母必须大写而其他字母为小写,且不能用引号包围。
如将True或False作为变量名:
True = 'Yes'
Flase = 'No'
程序执行将失败,并提示错误信息“SyntaxError: can't assign to keyword”。
当True或False作为布尔值时,首字母没有大写且其他字母没有小写,如:
logic_variable1 = TRUE
logic_variable2 = false
logic_variable3 = TruE
logic_variable4 = fALSE
print(type(logic_variable1))
print(type(logic_variable2))
print(type(logic_variable3))
print(type(logic_variable4))
程序执行将失败,并提示错误信息“NameError: name 'TRUE' is not defined”。此时,Python将其视为未定义的变量名。
如将True或False用引号包围起来,则程序执行时Python编译器会将其视为字符串型的值,如下所示:
logic_variable1 = 'True'
logic_variable2 = "False"
print(type(logic_variable1))
print(type(logic_variable2))
将输出:
<class 'str'>
<class 'str'>
在Python中,可用int函数将一个布尔值转换为一个整数值,用float函数将一个布尔值转换为一个浮点数,如下所示:
print(int(True))
print(int(False))
print(float(True))
print(float(False))
输出:
1
0
1.0
0.0
类似的,可用bool函数将一个数值转换为一个布尔值,如将数值0转换为布尔值False,将非0的整数或浮点数转换为布尔值True,如下所示:
print(bool(0))
print(bool(0.0))
print(bool(1))
print(bool(-1))
print(bool(5.0))
print(bool(3.01))
除了前两个返回布尔值False,其他都将返回布尔值True。
那么,能否将一个字符串值转换为一个布尔值吗?接下来,我们试试:
print(bool('This is a string'))
print(bool(''))
分别返回了布尔值True和False,意味着通过bool函数可以将一个非空字符串值转换为一个布尔值True,而将一个空字符串值转换为一个布尔值False。
再看看下面的代码:
print(bool())
print(bool(None))
都将返回布尔值False。
因此,如果bool函数无参数,或参数值为零(整数0或浮点数0)、空字符串('')、空值(None),都将返回布尔值False。
再执行以下代码,会分别返回什么结果?
print(bool(True + False))
print(bool(True - False))
print(bool(True * False))
分别返回了布尔值True、True和False。
为什么会这样呢?我们再试试:
print(bool(True / False))
程序执行失败,并提示错误信息“ZeroDivisionError: division by zero”。
原来,Python对布尔值进行运算时,会将True视为1,将False视为0,故而导致了除零错误。再执行如下代码:
print(int(True + False))
print(int(True - False))
print(int(True * False))
分别返回了数值1、0和0。
再试下:
print(int(1 + True))
print(int(0 + True))
print(int(1 + False))
print(int(0 + False))
将分别返回数值2、1、1、0。
二、布尔运算符
Python提供了三个布尔运算符not、and、or,其运算规则如下:
1. 逻辑非运算(not)
x = True
print(not x)
x = False
print(not x)
如x为True,则not x为False;反之,如x为False,则not x为True。
逻辑非运算(not)的真值表如下:
表3-1 逻辑非运算(not)的真值表
x | not x |
True | False |
False | True |
或如下图所示:
逻辑非运算(not) | x | y | |
True | False | ||
not x | False | True |
图3-1 逻辑非运算(not)的真值表
2. 逻辑与运算(and)
如下所示:
x = True
y = True
print(x and y)
x = True
y = False
print(x and y)
x = False
y = True
print(x and y)
x = False
y = False
print(x and y)
如x为True,y为True,则x and y为True;
如x为True,y为False,则x and y为False;
如x为False,y为True,则x and y为False;
如x为False,y为False,则x and y为False。
逻辑与运算(and)的真值表如下:
表3-2 逻辑与运算(and)的真值表
x | y | x and y |
True | True | True |
True | False | False |
False | True | False |
False | False | False |
或如下图所示:
逻辑与运算(and) | x | ||
True | False | ||
y | True | True | False |
False | False | False |
图3-2 逻辑与运算(and)的真值表
and是一个短路操作符(short-circuit operator),如果第一个表达式为True,则只计算第二个表达式。如果表达式不必计算所有操作数和运算符即可得出结果,则称为表达式的短路求值。
3. 逻辑或运算(or)
x = True
y = True
print(x or y)
x = True
y = False
print(x or y)
x = False
y = True
print(x or y)
x = False
y = False
print(x or y)
如x为True,y为True,则x or y为True;
如x为True,y为False,则x or y为True;
如x为False,y为True,则x or y为True;
如x为False,y为False,则x or y为False。
逻辑与运算(or)的真值表如下:
表3-3 逻辑或运算(or)的真值表
x | y | x or y |
True | True | True |
True | False | True |
False | True | True |
False | False | False |
或如下图所示:
逻辑与运算(or) | x | ||
True | False | ||
y | True | True | True |
False | True | False |
图3-3 逻辑或运算(or)的真值表
or也是一个短路操作符,如果第一个表达式为False,则只计算第二个表达式。
综上所述,可以总结为:
逻辑运算 | 结果 |
not x | 如果x为True,返回False;如果x为False,返回True。 |
x and y | 只有x和y都为True时,才返回True,否则返回False。 |
x or y | 只有x和y都为False时,才返回False,否则返回True。 |
在使用布尔运算符时,优先级依次从大到小为not、and、or,同一级的则从左至右依次运算。
如下所示:
print((1 < 2) or (1 > 2) and not (1 < 2))
将返回布尔值True。
其中,计算过程如下:
(1)首先,计算not (1 < 2),返回False。
(2)接着,计算(1 > 2) and not (1 < 2),即False and False,返回False。
(3)最后,计算(1 < 2) or False,即True or False,返回True。
需要注意的是,圆括号()中表达式的优先级要高于布尔运算符,如将上例中加入圆括号()来改变相关表达式的优先级:
print(((1 < 2) or (1 > 2)) and (not (1 < 2)))
将返回布尔值False。
具体计算过程如下:
(1)按照从左至右的顺序,首先,计算圆括号中的表达式((1 < 2) or (1 > 2)),返回True。
(2)接着,计算圆括号中的表达式(not (1 < 2)),返回False。
(3)最后,计算True and False,返回False。