零基础学Python程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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”决定。