4.5 运算汇总
以上讲述了各种运算符,如算术运算符、位运算符、逻辑运算符等。不同的运算符决定运算的先后顺序,也决定了运算后数据类型。本节对运算符的优先级和进行运算时的类型转换规则进行汇总,供读者参考。
4.5.1 运算符优先级汇总
Python的各种运算符优先级(从高到低)如表4-7所示。
表4.7 各种运算符优先级
4.5.2 类型转换规则
Python的运算方式多种多样,有算术运算、布尔逻辑运算等。每种运算又提供了多种运算符。在进行运算时,参加运算的数据又有多种类型,如整数、浮点数、复数、字符串、布尔值等。无论哪种运算,使用了哪种数据类型,Python都会遵循一个运算规则,即将运算符左右两侧的数据转换为同一类型,然后再进行运算。下面总结运算中每种数据类型的转换规则。
1. 算术运算
使用算术运算符连接起来的表达式为算术表达式。这种表达式进行的运算就是算术运算。下面介绍算术运算不同数据类型的转换规则。
(1)同类型数据
同类型数据进行算术运算,数据类型不进行转换,直接进行运算,得出对应的数据类型,如图4.28所示。
图4.28 不进行转换
(2)整数与浮点数运算
整数与浮点数运算时,将整数转换为浮点数,然后再进行运算,最后得出浮点数,如图4.29所示。
图4.29 整数转换为浮点数
(3)整数与复数运算
整数与复数运算时,将整数转换为复数,然后再进行运算,最后得出复数,如图4.30所示。
图4.30 整数转换为复数
(4)浮点数与复数运算
浮点数与复数运算时,将浮点数转换为复数,然后再进行运算,最后得出复数,如图4.31所示。
图4.31 浮点数转换为复数
(5)与布尔值运算
当整数、浮点数、复数与布尔值进行运算时,将布尔值转换为整数,然后与其他数据类型进行运算,得出其他类型的数据,如图4.32所示。
图4.32 布尔值转换为整数
Python的布尔值只有两个:True和False,在算术运算中,布尔值True被当作整数1,False被当作整数0参加运算。
【实例4-34】通过代码将浮点数5.5与布尔值True进行运算。代码如下:
执行后,得出运算结果为6.5。
实例中,5.5为浮点数,True布尔值为整数1,因此,浮点数5.5与整数1进行加法运算,最终运算结果为浮点数6.5。
【实例4-35】通过代码将浮点数5.5与布尔值False进行运算。代码如下:
执行后,得出运算结果为5.5。
实例中,5.5为浮点数,False布尔值为整数0,因此,浮点数5.5与整数0进行加法运算,最终运算结果为浮点数5.5。
2. 布尔逻辑运算
使用逻辑运算符连接起来的表达式为逻辑表达式。这种表达式进行的运算就是布尔逻辑运算。下面介绍布尔逻辑运算不同数据类型的转换规则。
(1)布尔类型与布尔类型进行逻辑运算
布尔类型与布尔类型进行逻辑运算,数据类型不进行转换,直接按照运算规则进行运算,如图4.33所示。
图4.33 数据类型不转换
【实例4-36】下面通过代码将布尔类型10>8与布尔类型5>3+6进行逻辑与运算,代码如下:
执行后,得出布尔类型值。
实例中,表达式10>8运算结果是一个布尔值True,表达式5>3+6运算结果是一个布尔值False。True与False进行逻辑与运算,最终运算结果为布尔类型,值为False。
【实例4-37】下面通过代码将布尔类型False与布尔类型True进行逻辑或运算,代码如下:
执行后,得出布尔类型值。
实例中,布尔类型值False与布尔类型值True进行逻辑或运算,最终运算结果为布尔类型,值为True。
(2)布尔类型与非布尔类型进行逻辑与运算
布尔类型与非布尔类型进行逻辑与运算,首先将布尔类型转换为布尔类型值,然后与非布尔类型进行运算。运算时将根据短路原则得出最终结果。该结果可能为布尔类型值也可能为非布尔类型相应的类型。为了方便讲解,这里将非布尔类型指定为整数5。
① 结果为非布尔类型值的转换规则如图4.34所示。
图4.34 结果为非布尔类型值的转换规则
② 结果为布尔类型值的转换规则如图4.35所示。
图4.35 结果为布尔类型值的转换规则
【实例4-38】通过代码将布尔类型5*5==12+13与浮点数60.8进行逻辑与运算,代码如下:
执行后,得出浮点数60.8,如下:
实例中,表达式5*5==12+13运算结果是一个布尔值True,True与浮点数60.8进行逻辑与运算,结果由and右侧的浮点数60.8决定。因此,最终结果为浮点数60.8。
【实例4-39】通过代码将布尔类型5*5==2**5与浮点数60.8进行逻辑与运算,代码如下:
执行后,得出布尔类型值False,如下:
实例中,表达式5*5==2**5运算结果是一个布尔值False,False与浮点数60.8进行逻辑与运算,结果由and左侧的布尔值决定。因此,最终结果为布尔值False。
(3)布尔类型与非布尔类型进行逻辑或运算
布尔类型与非布尔类型进行逻辑或运算,与逻辑与运算类似,也是先将布尔类型转换为布尔类型值,然后与非布尔类型进行运算,根据短路原则得出最终结果。
① 结果为布尔类型值的转换规则如图4.36所示。
图4.36 结果为布尔类型值的转换规则
② 结果为非布尔类型值的转换规则如图4.37所示。
图4.37 结果为非布尔类型值的转换规则
【实例4-40】通过代码将布尔类型45<=5*9与整数12进行逻辑或运算,代码如下:
执行后,得出布尔类型值True,如下:
实例中,表达式45<=5*9运算结果是一个布尔值True,True与整数12进行逻辑或运算,结果由or左侧的布尔值决定。因此,最终结果为布尔值True。
【实例4-41】通过代码将布尔类型45<5*9与整数12进行逻辑或运算,代码如下:
执行后,得出整数12,如下:
实例中,表达式45<5*9运算结果是一个布尔值False,False与整数12进行逻辑或运算,结果由or右侧的整数决定。因此,最终结果为整数12。
(4)非布尔类型与非布尔类型进行逻辑与运算
非布尔类型与非布尔类型进行逻辑与运算,首先将and左侧非布尔类型转换为布尔类型值,然后根据短路原则得出最终结果,但是该结果不是布尔类型值,而是非布尔类型对应的数据。
① 左侧的布尔类型值为True时,结果由右侧决定,如图4.38所示。
图4.38 右侧决定运算结果(逻辑与)
② 左侧的布尔类型值为False时,结果由左侧决定,如图4.39所示。
图4.39 左侧决定运算结果(逻辑与)
【实例4-42】通过代码将非布尔类型5*9与非布尔类型3+4进行逻辑与运算,代码如下:
执行后,得出非布尔类型数据3+4的计算值7,如下:
实例中,表达式5*9运算结果是45,对应的布尔值为True,True与表达式3+4进行逻辑与运算,结果由and右侧的表达式3+4决定。因此,最终结果为整数7。
【实例4-43】通过代码将非布尔类型5-5与非布尔类型3+4进行逻辑与运算,代码如下:
执行后,得出非布尔类型数据5-5的计算值0,如下:
实例中,表达式5-5运算结果是0,对应的布尔值为False,False与表达式3+4进行逻辑与运算,结果由and左侧的表达式5-5决定。因此,最终结果为0。
(5)非布尔类型与非布尔类型进行逻辑或运算
非布尔类型与非布尔类型进行逻辑或运算,与逻辑与运算类似,它是将or左侧非布尔类型转换为布尔类型值,然后根据短路原则得出最终结果,该结果也是非布尔类型对应的数据。
① 左侧的布尔类型值为True时,结果由左侧决定,如图4.40所示。
图4.40 左侧决定运算结果(逻辑或)
② 左侧的布尔类型值为False时,结果由右侧决定,如图4.41所示。
图4.41 右侧决定运算结果(逻辑或)
【实例4-44】通过代码将非布尔类型5*9与非布尔类型3+4进行逻辑或运算,代码如下:
执行后,得出非布尔类型数据5*9的计算值45,如下:
实例中,表达式5*9运算结果是45,对应的布尔值为True,True与表达式3+4进行逻辑或运算,结果由or左侧的表达式5*9决定。因此,最终结果为45。
【实例4-45】通过代码将非布尔类型5-5与非布尔类型3+4进行逻辑或运算,代码如下:
执行后,得出非布尔类型数据3+4的计算值7,如下:
实例中,表达式5-5运算结果是0,对应的布尔值为False,False与表达式3+4进行逻辑或运算,结果由or右侧的表达式3+4决定。因此,最终结果为7。
4.5.3 布尔类型值
非布尔类型数据之间进行逻辑运算时,这些非布尔类型数据都有对应的布尔类型值,如表4-8所示。
表4.8 其他数据对应的布尔类型值
【实例4-46】下面通过代码将字符串“60”与整数60进行逻辑或运算,代码如下:
执行结果如下:
得出的是一个字符串“60”,因为字符串“60”,转换为布尔值为True,在逻辑或运算中,计算结果由字符串“60”决定。