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