Python3 operator 模块全面学习教程
(适合 Python 入门到中级开发者,2025–2026 实用视角)
operator 是 Python 标准库中非常实用但经常被忽视的一个模块,它把常见的运算符(+、-、*、==、and、getitem、len 等)变成了函数形式,极大方便了函数式编程、高阶函数、排序 key、map、reduce、functools 等场景。
一、为什么需要 operator 模块?
最常见的两种写法对比:
# 传统写法(lambda 较多)
sorted(users, key=lambda u: u.age)
list(map(lambda x: x[1], items))
reduce(lambda x,y: x+y, numbers, 0)
# 使用 operator 写法(更简洁、可读性更好)
from operator import attrgetter, itemgetter, add
sorted(users, key=attrgetter('age'))
list(map(itemgetter(1), items))
reduce(add, numbers, 0)
核心优势:
- 性能略优(避免创建 lambda 函数)
- 代码更简洁、可读
- 与
functools.partial、itertools等配合极佳 - 可直接作为高阶函数参数
二、operator 模块核心函数分类(2025 常用)
1. 算术运算(最常用)
| 函数 | 等价运算符 | 示例代码 | 典型使用场景 |
|---|---|---|---|
add(a,b) | a + b | add(3,5) → 8 | reduce 加法 |
sub(a,b) | a – b | ||
mul(a,b) | a * b | reduce 乘法 | |
truediv(a,b) | a / b | Python 3 默认真除法 | |
floordiv(a,b) | a // b | 地板除 | |
mod(a,b) | a % b | ||
pow(a,b) | a ** b | pow(2,10) → 1024 | |
neg(obj) | -obj | 取负 | |
pos(obj) | +obj | (几乎不用) | |
abs(obj) | abs(obj) | 等价于内置 abs() |
2. 比较运算(非常常用)
| 函数 | 等价运算符 | 典型使用场景 |
|---|---|---|
eq(a,b) | a == b | filter、groupby |
ne(a,b) | a != b | |
lt(a,b) | a < b | sorted key、heapq |
le(a,b) | a <= b | |
gt(a,b) | a > b | |
ge(a,b) | a >= b |
3. 逻辑运算(使用频率中等)
| 函数 | 等价运算符 | 注意事项 |
|---|---|---|
and_(a,b) | a and b | 返回的是后者(不是 True/False) |
or_(a,b) | a or b | 返回的是前者或后者 |
not_(obj) | not obj |
重要提醒:operator.and_ 和 and 的行为完全一致,都是短路求值并返回原值,而不是布尔值。
4. 序列/容器操作(非常非常常用)
| 函数 | 作用 | 典型用法 |
|---|---|---|
itemgetter(*items) | 获取容器指定位置/键的值 | sorted(lst, key=itemgetter(1)) |
attrgetter(*attrs) | 获取对象指定属性 | sorted(users, key=attrgetter('age')) |
methodcaller(name, /, *args, **kwargs) | 调用对象的方法 | methodcaller('lower')('Hello') → ‘hello’ |
itemgetter 与 attrgetter 对比(最常考)
from operator import itemgetter, attrgetter
students = [
{'name':'Tom', 'score':98, 'age':19},
{'name':'Jerry','score':85, 'age':20},
]
# 多字段排序(先按分数降序,相同分数按年龄升序)
sorted(students, key=itemgetter('score','age'), reverse=True) # 错误写法
# 正确写法:需要组合多个 itemgetter 或使用 lambda
from functools import cmp_to_key
sorted(students,
key=lambda x: (-x['score'], x['age'])) # 传统写法
# operator 优雅写法(推荐)
from operator import itemgetter, neg
sorted(students,
key=lambda x: (neg(x['score']), x['age']))
更推荐的现代写法(Python 3.10+):
from operator import itemgetter
# 多字段 + 部分反序
get_score = itemgetter('score')
get_age = itemgetter('age')
sorted(students,
key=lambda x: (-get_score(x), get_age(x)))
5. 位运算(使用较少,但很纯粹)
| 函数 | 运算符 | 说明 |
|---|---|---|
and_(a,b) | & | 按位与 |
or_(a,b) | | | 按位或 |
xor(a,b) | ^ | 按位异或 |
inv(obj) | ~ | 按位取反 |
lshift(a,b) | << | 左移 |
rshift(a,b) | >> | 右移 |
6. 其他实用函数(进阶)
| 函数 | 作用 | 典型场景 |
|---|---|---|
concat(a,b) | a + b(序列拼接) | reduce 拼接列表 |
iconcat(a,b) | a += b(就地拼接) | |
delitem(a,b) | del a[b] | |
setitem(a,b,c) | a[b] = c | |
length_hint(obj) | 获取容器大致长度(C++风格) | 预分配内存时有用 |
indexOf(a,b) | a.index(b) | |
countOf(a,b) | a.count(b) |
总结表格:最值得记住的 10 个 operator 函数(2025–2026 面试/实战 Top10)
| 排名 | 函数 | 主要用途 | 出现频率 |
|---|---|---|---|
| 1 | itemgetter | 按元组/列表/字典的第 n 项排序、取值 | ★★★★★ |
| 2 | attrgetter | 按对象属性排序、取值 | ★★★★★ |
| 3 | methodcaller | 调用对象方法(常用于 map) | ★★★★ |
| 4 | add / mul | reduce 求和、求积 | ★★★★ |
| 5 | lt / gt / eq | 自定义比较函数 | ★★★ |
| 6 | and_ / or_ | 函数式逻辑运算 | ★★★ |
| 7 | neg | 反转排序(配合 sorted reverse=False) | ★★★ |
| 8 | truediv / floordiv | 函数式除法 | ★★ |
| 9 | setitem / delitem | 函数式修改容器 | ★★ |
| 10 | concat | reduce 拼接序列 | ★★ |
练习建议(由浅入深)
- 用
itemgetter实现按字典中某个 key 排序 - 用
attrgetter对对象列表多字段排序(分数降序 + 年龄升序) - 用
methodcaller+map把一堆字符串全部转小写 - 用
reduce+add/mul实现求和、求积 - 尝试用
operator重写一个曾经写过很多 lambda 的 sorted / max / min 场景
如果你想看某个具体场景的完整代码示例(比如多字段复杂排序、groupby 配合、与 pandas 结合等),可以直接告诉我,我可以立刻给出针对性代码。