运算符 | 描述 |
lambda | lambda 表达式 |
if -- else | 条件表达式 |
or | 布尔逻辑或 OR |
and | 布尔逻辑与 AND |
not x | 布尔逻辑非 NOT |
in, not in, is, is not, <, <=, >, >=, !=, == | 比较运算,包括成员检测和标识号检测 |
| | 按位或 OR |
^ | 按位异或 XOR |
& | 按位与 AND |
<<, >> | 移位 |
+, - | 加和减 |
*, @, /, //, % | 乘,矩阵乘,除,整除,取余 |
+x, -x, ~x | 正,负,按位非 NOT |
** | 乘方 |
await x | await 表达式 |
x[index], x[index:index], x(arguments…), x.attribute | 抽取,切片,调用,属性引用 |
[expressions…], {key: value…}, {expressions…} | 绑定或加圆括号的表达式,列表显示,字典显示,集合显示 |
不同语言的运算符大同小异,但是优先级却略有不同。我平时长期使用and
和or
进行逻辑操作。但是今天在scipy的sparse库里,稀疏矩阵无法使用and
和or
进行逻辑操作,改用|
和&
代替布尔逻辑,对于布尔量结果是一样的。
问题来了,对于C、Java等经典语言,按位操作和布尔逻辑的优先级是并列的,先按位后布尔,中间没有其他运算。而对于Python,按位操作和布尔操作之间有比较运算。
a<1e-2 or b<1e-3
这样的代码是日常使用,合理的代码。而
a<1e-2 | b<1e-3
则会出错,因为|
是先于<
的。
正确的写法应该是
(a<1e-2) | (b<1e-3)