运算符优先级是编程中控制表达式运算顺序的核心规则,它是数学运算次序(如 “先乘除后加减”)的延伸,涵盖了算术、逻辑、位运算、赋值等多种运算符。在Python中,优先级高的运算符会被优先执行;若运算符优先级相同,则根据结合性(左结合或右结合)决定执行顺序。
1. 核心优先级规则与层级(结合表格从高到低)
| 优先级 | 类型 | 示例 | 结合性 |
| 最高 | 小括号、索引、属性访问 | ()、x[0]、x.attr | 无 |
| 高 | 乘方、按位取反、符号运算 | **、~、+(正号)、-(负号) | 乘方为右结合,其余左结合 |
| 中 | 乘除、加减 | *、/、//、%、+、- | 左结合 |
| 中低 | 位移、按位与 / 异或 / 或 | 、<<、&、^、` | `(左结合) |
| 低 | 比较、身份、成员运算 | ==、is、in等 | 左结合 |
| 极低 | 逻辑非、与、或 | not、and、or | not右结合,and/or左结合 |
| 最低 | 逗号运算符 | exp1, exp2 | 左结合 |
1.1 结合性介绍:
结合性是编程语言中用于解决优先级相同的运算符在表达式中出现时,如何确定执行顺序的规则。
简单说:当多个运算符优先级相同时,结合性决定了它们是 “从左往右算” 还是 “从右往左算”。
左结合:
运算符从左到右依次执行。即多个同优先级运算符连续出现时,先计算最左边的,再依次向右计算。
示例:算术运算符中的 +、-、*、/ 都是左结合。
#左结合:先算 8 - 3 = 5,再算 5 - 2 = 3
print(8 - 3 - 2) #等价于 (8 - 3) - 2 → 3
#左结合:先算 10 / 5 = 2,再算 2 / 2 = 1
print(10 / 5 / 2) #等价于 (10 / 5) / 2 → 1右结合
运算符从右到左依次执行。即多个同优先级运算符连续出现时,先计算最右边的,再依次向左计算。
示例:乘方运算符 **、赋值运算符 = 是典型的右结合。
#右结合:先算 3** 2 = 9,再算 2 **9 = 512
print(2** 3 **2) #等价于 2** (3 **2) → 512(而非 (2**3)**2=64)
#右结合:先算 b = 5,再算 a = b(即 a = 5)
a = b = 5 #等价于 a = (b = 5)
print(a, b) #输出:5 51.2 结合性与优先级的关系
- 优先级:决定不同运算符的执行顺序(如先乘除后加减)。
- 结合性:仅当运算符优先级相同时,才起作用(决定同优先级运算符的执行方向)。
例如:10 + 5 * 2中,* 优先级高于 +,所以先算5*2(优先级决定);而10 – 5 – 2中,两个-优先级相同,左结合决定先算左边的10-5。
1.3 最后
结合性是为了消除 “同优先级运算符连续出现时的执行顺序歧义” 而制定的规则:
- 大部分运算符(如算术、比较、逻辑and/or)是左结合;
- 少数运算符(如**、=)是右结合。
在实际编程中,若对结合性不确定,可通过括号()强制指定执行顺序(括号优先级最高,不受结合性影响)。
2. 优先级示例演示
通过代码示例直观理解不同运算符的执行顺序:
2.1 算术 vs 比较运算符
算术运算符(如*、+)优先级高于比较运算符(如==、>)。
#先算 3*5=15,再判断 15>10 → 结果为True
print(3 * 5 > 10) 2.2 比较 vs 逻辑运算符
比较运算符(如==)优先级高于逻辑运算符(如or)。
#先算 2==2 → True 和 3==4 → False,再执行逻辑或 → 结果为True
print(2 == 2 or 3 == 4) 2.3 逻辑运算符内部优先级
not > and > or,同优先级按结合性执行。
#执行顺序:not True → False → False and False → False → False or True → True
print(not True and False or True) 2.4 括号强制改变优先级
小括号()优先级最高,可强制覆盖默认顺序。
#先算 (2+3)=5,再算 5*4=20(若无括号,会先算 3*4=12,再算 2+12=14)
print((2 + 3) * 4) 3. 短路求值与优先级的联动
逻辑运算符(and、or)的短路求值特性会结合优先级生效:
- and:若左操作数为False,直接返回False(不再执行右操作数)。
- or:若左操作数为True,直接返回True(不再执行右操作数)。
示例:
def func():
print("执行了func")
return True
#因为 1==2 是False,and的左操作数为False,直接返回False,func()不会执行
print(1 == 2 and func()) 4. 总结
掌握运算符优先级是避免表达式逻辑错误的关键。建议在编写复杂表达式时,通过小括号()明确运算顺序,既提升代码可读性,又能避免因优先级理解偏差导致的bug。