
3.3 运算优先级
在进行复杂的数值运算时,我们应当考虑一些不同操作符号之间的运算顺序,例如,看一下下面的数学等式:
2+3*5=25
这个等式的结果是否正确?还是可以写成下面的等式:
2+3*5=17
一个等式的结果除了要考虑特定操作符完成的任务外,还应该考虑不同操作符之间的运算顺序问题。如果我们对上面的数学表达式先进行加法运算,那么会得到:
2+3=5
在完成加法操作后,我们就可以进行下一步的操作,在这里是乘法运算:
5*5=25
在进行完两个操作符的运算后,上面的表达式就可以得到一个确定的结果了。如果对上面的表达式采取不同的运算顺序,会得到另外一种结果,这里,我们可以先对上面的表达式进行乘法运算:
3*5=15
在完成乘法操作后,便可以进行加法运算,然后得到这样的结果:
2+15=17
在完成这两个操作符的任务后,我们就可以得到一个最终的结果。在数学学科中,第二个运算的顺序是符合表达式意义的,所以能够得到正确的答案17。但是在编程语言中,计算机并不一定会知道上面的表达式应该采取哪一种运算方式,为了使表达式得到和数学计算一样的结果。Python在遇到操作符时,会考虑不同操作符之间的优先级顺序,对于高优先级的操作符,可以先进行运算,对于那些优先级比较低的操作符,运算的操作会排在后面。在数学学科中,为了指定不同操作符操作的先后顺序,定义了运算优先级:这个优先级可以指定先进行哪些操作符,后进行哪些操作符,从而确保操作符的位置对表达式的运算没有影响。
下面,我们来分析上面的表达式。在这个例子中,虽然加号是排在乘号前面,但是按照优先级的顺序,在进行表达式处理时必须先操作乘法运算符。Python解释器中定义的优先级顺序和数学学科中的优先级顺序相同,所以Python解释器在遇到这个表达式时先进行乘法操作后进行加法操作。为了验证这个想法,我们在Python的交互模式中输入这个表达式,并观察Python解释器返回的结果是否像我们上面分析的。

Python解释器中定义的优先级和数学学科中的一样,在所有优先级中,指数操作符具有最高的优先级,即指数运算是最先完成的。排在指数操作符后面的运算符是乘法运算符和除法运算符,最后是加法运算符和减法运算符。这样的运算顺序通常被称为自然运算顺序,在某些情况下,我们希望能够改变这些自然运算顺序,此时可以像数学学科中的那样使用一个圆括号来完成这个任务,对于那些想提前进行的表达式,可以在这个表达式的两边加上一对圆括号,比如下面的表达式:

在上面的表达式中,因为加法表达式的两端有一对运算符,所以Python解释器会首先进行加法操作的运算,这样可以得到结果5,在完成圆括号的操作后,Python解释器会继续进行乘法运算5*5,计算后可以得到结果25。