Python运算符的优先级和结合性¶
优先级和结合性是Python表达式中比较重要的两个概念, 它们决定了先执行表达式中的哪一部分.
Python运算符优先级¶
所谓优先级, 就是当多个运算符同时出现在同一个表达式中, 先执行哪个运算符.
例如, 对于表达式a + b * c, Python会先计算乘法再计算加法, 因为*的优先级高于+.
Python支持几十种运算符, 被划分成将近二十个优先级, 有的运算符优先级不同, 有的运算符优先级相同, 请看下表.
Python运算符优先级和结合性一览表¶
运算符说明
Python运算符
优先级
结合性
小括号
()
19
无
索引运算符
x[i]或x[i1:i2[:i3]]
18
左
属性访问
x.arrtibute
17
左
乘方
**
16
左
按位取反
~
15
右
符号运算符
+(正号)) -(负号)
14
右
乘除
* / // %
13
左
加减
+ -
12
左
位移
<< >>
11
左
按位与
&
10
右
按位异或
^
9
左
按位或
|
8
左
比较运算符
== != > >= < <=
7
左
is运算符
is is not
6
左
in运算符
in not in
5
左
逻辑非
not
4
右
逻辑与
and
3
左
逻辑或
or
2
左
逗号运算符
,
1
左
虽然Python运算符存在优先级的关系, 但不推荐过度依赖运算符的优先级, 这会导致程序的可读性降低.
建议:
不要把一个表达式写得过于复杂, 如果一个表达式过于复杂, 可以尝试把它拆分来书写;
不要过多地依赖运算符的优先级来控制表达式的执行顺序, 这样可读性太差, 应尽量使用()来控制表达式的执行顺序.
Python运算符结合性¶
所谓结合性, 就是当一个表达式中出现多个优先级相同的运算符时, 先执行哪个运算符: 先执行左边的叫左结合性, 先执行右边的叫右结合性.
例如, 对于表达式100 / 25 * 16, /和*的优先级相同, 应该先执行哪一个呢?
这个时候就不能只依赖运算符优先级决定了, 还要参考运算符的结合性.
/和*都具有左结合性, 因此先执行左边的除法, 再执行右边的乘法, 最终结果是64.
Python中大部分运算符都具有左结合性, 也就是从左往右执行;
只有单目运算符(例如not逻辑运算符), 赋值运算符和三目运算符例外, 它们具有右结合性, 也就是从右往左执.
总结¶
当一个表达式中出现多个运算符时, Python会先比较各个运算符的优先级, 按照优先级从高到低的顺序依次执行;
当遇到优先级相同的运算符时, 再根据将结合性决定先执行哪个运算符: 如果是左结合性就先执行左边的运算符, 如果是右结合性就先执行右边的运算符.