Python 3.8从零开始学
上QQ阅读APP看书,第一时间看更新

2.6.9 运算符的优先级

表2-8列出了从最高到最低优先级的所有运算符。

表2-8 运算符的优先级

当一个表达式中出现多个操作符时,求值的顺序依赖于优先级规则。Python中运算符的优先级规则遵守数学操作符的传统规则。

小智:“小萌,你还记得以前所学的数学里面操作符的优先级规则是怎样的吗?”

小萌:“还记得,就是有括号先算括号里的,无论是括号里还是括号外的,都是先乘除、后   加减。”

在Python中有更多操作运算符,可以使用缩略词PEMDAS帮助记忆部分规则。

(1)括号(Parentheses,P)拥有最高优先级,可以强制表达式按照需要的顺序求值,括号中的表达式会优先执行,也可以利用括号使得表达式更加易读。

例如,对于一个表达式,想要执行完加减后再做乘除运算,在交互模式下输入如下:

>>> a=20
>>> b=15
>>> c=10
>>> d=5
>>> e=0
>>> e=(a - b) * c / d
>>> print('(a-b)*c/d=', e)
(a-b)*c/d= 10.0

顺利达到了我们想要的结果,如果不加括号会怎样呢?

>>> e=a – b * c / d
>>> print('a-b*c/d=', e)
a-b*c/d= -10.0

结果与前面完全不同了,这里根据先乘除后加减进行运算。如果表达式比较长,加上括号就可以使得表达式更易读。

>>> e=a + b + c – c * d
>>> print('a+b+c-c*d=', e)
a+b+c-c*d= -5

以上输入没有加括号,表达式本身没有问题,但看起来不太直观。如果进行如下输入:

>>> e=(a + b + c) - (c * d)
>>> print('(a+b+c)-(c*d)=', e)
(a+b+c)-(c*d)= -5

这样看起来就非常直观。运算结果还是一样的,但我们一看就能明白该表达式的执行顺序是怎样的。

(2)乘方(Exponentiation,E)操作拥有次高的优先级,例如:

>>> 2 ** 1 + 2
4
>>> 2 ** (1 + 2)
8
>>> 2 ** 2 * 3
12
>>> 2 * 2 ** 3
16
>>> 2 ** (2 * 3)
64

以上结果解释:2的一次方为2,加2后结果为4;1加2等于3,2的3次方结果为8;2的2次方为4,4乘以3等于12;2的3次方为8,2乘以8等于16;2乘以3等于6,2的6次方为64。

(3)乘法(Multiplication,M)和除法(Division,D)优先级相同,并且高于有相同优先级的加法(Addition,A)和减法(Subtraction,S),例如:

>>> a + b * c - d
165
>>> a * b / c + d
35.0

(4)优先级相同的操作按照自左向右的顺序求值(除了乘方外),例如:

>>> a + b – c + d
30
>>> a + b – c - d
20

其他运算符的优先级在实际使用时可以自行尝试判断。若通过观察判断不了,则可以在交互模式下通过实验进行判断。