Python运算符的优先级和结合性¶
优先级和结合性是Python表达式中比较重要的两个概念, 它们决定了先执行表达式中的哪一部分.
Python运算符优先级¶
所谓优先级, 就是当多个运算符同时出现在同一个表达式中, 先执行哪个运算符.
例如, 对于表达式a + b * c, 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会先比较各个运算符的优先级, 按照优先级从高到低的顺序依次执行; 当遇到优先级相同的运算符时, 再根据将结合性决定先执行哪个运算符: 如果是左结合性就先执行左边的运算符, 如果是右结合性就先执行右边的运算符.