Python运算符优先级

运算符描述
lambdalambda 表达式
if -- else条件表达式
or布尔逻辑或 OR
and布尔逻辑与 AND
not x布尔逻辑非 NOT
in, not in, is, is not, <, <=, >, >=, !=, ==比较运算,包括成员检测和标识号检测
|按位或 OR
^按位异或 XOR
&按位与 AND
<<, >>移位
+, -加和减
*, @, /, //, %乘,矩阵乘,除,整除,取余
+x, -x, ~x正,负,按位非 NOT
**乘方
await xawait 表达式
x[index], x[index:index], x(arguments…), x.attribute抽取,切片,调用,属性引用
[expressions…], {key: value…}, {expressions…}绑定或加圆括号的表达式,列表显示,字典显示,集合显示
引自 https://docs.python.org/zh-cn/3.7/reference/expressions.html#operator-precedence

不同语言的运算符大同小异,但是优先级却略有不同。我平时长期使用andor进行逻辑操作。但是今天在scipy的sparse库里,稀疏矩阵无法使用andor进行逻辑操作,改用|&代替布尔逻辑,对于布尔量结果是一样的。

问题来了,对于C、Java等经典语言,按位操作和布尔逻辑的优先级是并列的,先按位后布尔,中间没有其他运算。而对于Python,按位操作和布尔操作之间有比较运算。

a<1e-2 or b<1e-3 

这样的代码是日常使用,合理的代码。而

a<1e-2 | b<1e-3 

则会出错,因为|是先于<的。

正确的写法应该是

(a<1e-2) | (b<1e-3) 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注