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 |
| // | 地板除(向下取整) |
| % | 取模 |
| ** | 幂 |
工程陷阱
- 对普通
int/float数值,/做真除法并返回float;自定义数值类型可以重载/,因此不要把“永远返回 float”理解成所有对象都成立。 - 地板除
//在负数下表现很容易误解:
-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 运算符优先级(常用简表)
从高到低:
()x[index] x() x.attr**+x -x ~x* @ / // %+ -<< >>&^|== != > < >= <= is is not in not innotandor- 条件表达式
x if condition else y lambda:=
普通赋值 =、+= 等属于赋值语句,不放在这个表达式优先级表里。
工程经验:不要依赖优先级,必要时加括号提升可读性。
评论将在接近此处时加载,也可点击立即加载。