跳到主要内容

Python 运算符


Python 运算符

1. Python 运算符总览

Python 常用运算符可以按下面几类来记:

A. 算术运算符

+  -  *  /  //  %  **  @

其中 @ 是矩阵乘法运算符,常见于 NumPy 等对象。

B. 比较(关系)运算符

==  !=  >  <  >=  <=

C. 赋值运算符

=  +=  -=  *=  /=  //=  %=  **=  @=  &=  |=  ^=  >>=  <<=

D. 逻辑运算符

and  or  not

E. 位运算符

&  |  ^  ~  <<  >>

F. 成员运算符

in  not in

G. 身份运算符

is is not(判断两个引用是否指向同一个对象)

H. 特殊运算符

:=(海象运算符,Python 3.8+)

以上覆盖日常 Python 代码中最常见的运算符。


2. 各类运算符 —— 详细解释 + 陷阱

A. 算术运算符

运算符 含义
+ 加法 / 拼接 (str, list)
- 减法
* 乘法 / 重复(str * 3)
/ 真除法;普通 int/float 运算通常返回 float
// 地板除(向下取整)
% 取模
** 幂

工程陷阱

  1. 对普通 int / float 数值,/ 做真除法并返回 float;自定义数值类型可以重载 /,因此不要把“永远返回 float”理解成所有对象都成立。
  2. 地板除 // 在负数下表现很容易误解:
    -3 // 2 == -2(不是 -1)

B. 比较运算符

== != > < >= <=

注意:

  • == 比较值是否相等
  • is 比较的是对象身份,也就是两个引用是否指向同一个对象;不要把它简单理解成“比较内存地址”

工程踩坑示例

a = []
b = []
print(a is b)   # False,不是同一个对象
print(a == b)   # True,内容相等

不要用 257 is 257 这类例子判断身份:整数、字符串等不可变对象是否被复用属于实现细节,可能受到解释器、常量折叠等影响。判断 None 时则推荐写 x is None。


C. 赋值运算符

包括复合赋值:

a += 1
a -= 1
a *= 2
a //= 2
a %= 7
a **= 3

复合赋值对可变对象会直接修改原对象:

lst = [1,2]
a = lst
a += [3]
print(lst)     # [1,2,3],被修改

D. 逻辑运算符

and  or  not

and / or 会返回参与运算的对象

它们不一定返回 True/False;not 则始终返回布尔值。

核心逻辑:

表达式 结果
A and B 若 A 为真 → 返回 B;若 A 为假 → 返回 A
A or B 若 A 为真 → 返回 A;若 A 为假 → 返回 B

工程中常用于兜底和简化判断

例:

config_value = user_config or default_config

只要 user_config 是假值(如 None、False、0、""、空容器),就会返回 default_config。如果 0、空字符串等本身是合法值,就不要用 or 代替显式的 is None 判断。


E. 位运算符

& | ^ ~ << >>

工业控制、协议解析极为常用(PLC、Modbus、CAN)。

示例:

status = 0b101101
alarm = status & 0b001000   # 掩码检测第三位

F. 成员运算符

in  not in

对字符串、列表、字典键等检查成员:

"a" in ["a","b"]
"age" in {"age":18}

G. 身份运算符

is  is not

用于判断两个引用是否指向同一个对象,也就是对象身份是否相同。


H. 海象运算符(Python 3.8+)

:= 在表达式内部执行赋值。

if (n := len(data)) > 0:
    print("长度:", n)

工程上用于节约重复计算。


3. 工程案例教程(重点)

下面给你多行业常用运算符的工程级用法。


3.1 案例 1:SQL 拼接(避免注入 + or 的使用逻辑)

错误写法(容易 SQL 注入):

sql = f"SELECT * FROM user WHERE name='{name}'"

正确写法:

cursor.execute("SELECT * FROM user WHERE age > %s AND is_active = %s",
               (age, True))

or 逻辑在 SQL 拼接场景中的正确用法

用户输入可能为空,用 or 做兜底:

name = input_name or "%"

3.2 案例 2:PLC 数据控制(位运算 + 逻辑运算)

读取设备状态:

status = plc.read_area(...)

# status 是字节数组
run_flag = get_bool(status, 0, 1)  # 第二位
err_flag = get_bool(status, 0, 2)

控制写入单个位时要保留同一字节中的其他位,使用读-改-写:

data = plc.read_area(...)
set_bool(data, 0, 1, True)
plc.write_area(..., data)

这能避免用全零字节覆盖其他位;但读-改-写本身不是原子操作,并发写入时仍需由 PLC 程序或上层逻辑协调。

位运算解析复杂状态:

mask = 0b001100
alarm = (status_byte & mask) != 0

3.3 案例 3:数据上下限校验(比较运算符 + 逻辑)

你的典型工程代码:

low, high = 0.0, 200.0
if not (low <= value <= high):
    print("超限")

逻辑运算符常用于构造可读性强的判断:

if value < low or value > high:
    raise ValueError("越界")

3.4 案例 4:模型预测(机器学习)

特征缺失时兜底要注意 0 可能是合法值。如果只想处理 None,可以显式判断:

temp = row.get("temp")
if temp is None:
    temp = 0

speed = row.get("speed")
if speed is None:
    speed = 1

复合赋值实现特征标准化:

x -= mean
x /= std

3.5 案例 5:区块链 / 哈希

低层字节数组计算非常依赖位运算:

def xor_bytes(a, b):
    return bytes(x ^ y for x, y in zip(a, b))

Block nonce 搜索:乘法、加法、复合运算大量使用。


4. Python 运算符优先级(常用简表)

从高到低:

  1. ()
  2. x[index] x() x.attr
  3. **
  4. +x -x ~x
  5. * @ / // %
  6. + -
  7. << >>
  8. &
  9. ^
  10. |
  11. == != > < >= <= is is not in not in
  12. not
  13. and
  14. or
  15. 条件表达式 x if condition else y
  16. lambda
  17. :=

普通赋值 =、+= 等属于赋值语句,不放在这个表达式优先级表里。

工程经验:不要依赖优先级,必要时加括号提升可读性。


文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
赏
评论

评论将在接近此处时加载,也可点击立即加载。

  目录