

新闻资讯
技术学院Python运算符按固定优先级从高到低计算,括号最高,幂运算右结合,一元运算次之,乘除加减左结合,比较运算支持链式,调用与访问绑定最紧;不确定时用ast解析或加括号验证。
Python表达式按固定优先级从高到低依次计算,相同优先级则按结合性(多数为左结合)从左到右求值。理解这个规则,能避免括号滥用,也能预防隐含错误。
记住几个核心分界点比死记全部17级更实用:
2 + 3 * 4 是 14,但 (2 + 3) * 4 是 202 ** 3 ** 2 等价于 2 ** (3 ** 2) = 512,不是 (2 ** 3) ** 2 = 64-3 ** 2 实际算的是 -(3 ** 2) = -9,不是 (-3) ** 2 = 98 / 4 * 2 = 4.0,不是 1.01 等价于 1 ,不是先算左边再和10比
and 高于 or: False or True and False 结果是 False(先算 True and False)优先级不直观的地方最容易出 bug:
and / or 和位运算(&, |)时,位运算实际优先级更高,a & b == c 等价于 a & (b == c),通常应写成 (a & b) == c
is 或 in 做条件判断时,注意它比 == 优先级还低?不对——is 和 == 同级,但比 and 高,所以 x is None and y > 0 没问题;但 x is y in z 是合法的链式比较,等价于 x is y and y in z
()、下标 []、属性访问 . 本身不是运算符,但它们绑定最紧密,比如 obj.method()[i] + 1 总是先取方法、再取索引、再加 1不确定时别猜,用 Python 交互环境直接试:
立即学习“Python免费学习笔记(深入)”;
ast.dump(ast.parse("表达式", mode='eval'), indent=2) 查看抽象语法树,能清晰看到分组结构a + b * c > d and not e or f 改成:tmp1 = b * ctmp2 = a + tmp1 > dtmp3 = not eresult = tmp2 and tmp3 or f