PYTHON KNOWLEDGE · 04
运算符、表达式与优先级
完整区分算术、比较、逻辑、成员、身份和位运算,并用优先级表消除歧义。
GESP 1 级GESP 2 级GESP 3 级
01 · FORMAL DEFINITION
正式定义
表达式求值得到一个值。运算符规定如何组合操作数;当一个表达式含多个运算符时,优先级和结合方向决定求值顺序,括号可以明确改变顺序。
02 · MUST KNOW
学完这一章,必须说清楚的规则
- 01
/ 总是得到浮点结果;// 是向负无穷方向取整的整除;% 与 // 满足 a == (a // b) * b + a % b。
- 02
比较可以链式书写,如 0 <= x < 10;and/or 会短路并返回最后求值的操作数,不一定返回 bool。
- 03
== 比较值是否相等,is 比较是否为同一个对象;判断 None 应写 is None。
- 04
in/not in 做成员测试;对 dict 测试的是键。
- 05
位运算作用于整数的二进制位;负整数按无限长二进制补码语义理解。
- 06
复杂表达式即使能靠优先级正确运行,也应使用括号表达意图。
03 · RUNNABLE EXAMPLE
可运行示例与因果解释
a = -7
print(a // 3, a % 3)
print(2 + 3 * 4, (2 + 3) * 4)
print(0 <= 7 < 10)HIGH → LOW
运算符优先级完整速查
同一行通常优先级相同。复杂表达式仍建议加括号表达意图,不把可读性交给记忆。
| 级别 | 运算符/结构 | 含义 | 结合 |
|---|---|---|---|
最高 | (表达式)、[列表]、{字典/集合} | 分组与容器显示 | — |
| x[index]、x[start:stop]、x(...)、x.attr | 下标、切片、调用、属性 | 左到右 |
| await x | 等待表达式 | — |
| ** | 乘方 | 右到左 |
| +x、-x、~x | 正负号、按位取反 | 右到左 |
| *、@、/、//、% | 乘、矩阵乘、除、整除、取模 | 左到右 |
| +、- | 加、减 | 左到右 |
| <<、>> | 移位 | 左到右 |
| & | 按位与 | 左到右 |
| ^ | 按位异或 | 左到右 |
| | | 按位或 | 左到右 |
| in、not in、is、is not、<、<=、>、>=、!=、== | 成员、身份与比较(可链式) | 链式 |
| not x | 逻辑非 | 右到左 |
| and | 逻辑与(短路) | 左到右 |
| or | 逻辑或(短路) | 左到右 |
| x if condition else y | 条件表达式 | 右到左 |
| lambda | 匿名函数 | — |
最低 | := | 赋值表达式 | — |
COMMON PITFALLS
常见误区
- 把 // 当成简单截断
- 用 is 比较数字或字符串的值
- 忘记 and 的优先级高于 or
- 连续位移、比较和逻辑运算却不加括号
SCOPE & BOUNDARIES
适用边界
- 浮点数比较受二进制表示误差影响,需要按问题选择容差。
- 运算符可由自定义类重载,因此相同符号对不同类型可能有不同语义。