operator 模块是 Python 标准库中的一个模块,提供了一组函数,对内置操作符(如算术运算符、比较运算符、位运算符等)进行函数化封装。这使得这些操作符可以像普通函数一样被传递、存储和调用。这个模块对于需要高效执行某些操作(如排序、筛选等)的场景特别有用。

算术运算符函数
operator 模块中定义了与常用算术运算符对应的函数。
- add(a, b):返回 a + b
- sub(a, b):返回 a – b
- mul(a, b):返回 a * b
- truediv(a, b):返回 a / b(浮点除法)
- floordiv(a, b):返回 a // b(地板除法)
- mod(a, b):返回 a % b
- pow(a, b):返回 a ** b
- neg(a):返回 -a
- pos(a):返回 +a
- abs(a):返回 abs(a)
比较运算符函数
这些函数对应于常见的比较运算符。
- eq(a, b):返回 a == b
- ne(a, b):返回 a != b
- lt(a, b):返回 a < b
- le(a, b):返回 a <= b
- gt(a, b):返回 a > b
- ge(a, b):返回 a >= b
位运算符函数
这些函数对应于位运算符。
- and_(a, b):返回 a & b(按位与)
- or_(a, b):返回 a | b(按位或)
- xor(a, b):返回 a ^ b(按位异或)
- invert(a):返回 ~a(按位取反)
- lshift(a, b):返回 a << b(左移位)
- rshift(a, b):返回 a >> b(右移位)
序列操作函数
这些函数用于处理序列(如列表、元组、字符串等)。
- concat(a, b):连接两个序列,等同于 a + b
- contains(a, b):检查 b 是否为 a 的子元素,等同于 b in a
- countOf(a, b):返回 b 在 a 中出现的次数
- indexOf(a, b):返回 b 在 a 中第一次出现的索引
- getitem(a, b):返回 a[b],即获取 a 中索引为 b 的元素
- setitem(a, b, c):将 a[b] 设为 c
- delitem(a, b):删除 a 中索引为 b 的元素
- itemgetter(*items):返回一个函数,该函数会从输入对象中获取指定索引/键的元素。
属性和方法操作函数
operator.attrgetter
operator.attrgetter 是 Python 标准库中的一个工具,位于 operator 模块中。它用于创建一个可调用对象,该对象从其操作数中获取指定的属性。这在需要对对象列表进行排序、分组或筛选时非常有用,特别是在需要按对象的某个属性进行操作时。
基本用法
from operator import attrgetter
class User:
def __init__(self, name, age):
self.name = name
self.age = age
users = [User('Alice', 30), User('Bob', 25), User('Charlie', 35)]
# 使用 attrgetter 按年龄排序
users_sorted_by_age = sorted(users, key=attrgetter('age'))
for user in users_sorted_by_age:
print(user.name, user.age)
# 输出:
# Bob 25
# Alice 30
# Charlie 35
获取多个属性
attrgetter 也可以用于获取多个属性:
from operator import attrgetter
class User:
def __init__(self, name, age):
self.name = name
self.age = age
users = [User('Alice', 30), User('Bob', 25), User('Charlie', 35)]
# 获取用户的姓名和年龄
get_name_and_age = attrgetter('name', 'age')
for user in users:
print(get_name_and_age(user))
# 输出:
# ('Alice', 30)
# ('Bob', 25)
# ('Charlie', 35)
应用场景
- 排序: attrgetter 常用于对对象列表进行排序,例如按对象的某个属性排序。
- 分组: 在分组操作中,可以使用 attrgetter 来提取用于分组的关键属性。
- 筛选: 在筛选对象时,可以使用 attrgetter 提取需要检查的属性。
与 lambda 的对比
虽然可以使用 lambda 函数实现类似的功能,但 attrgetter 通常更简洁且性能更好,特别是在需要对大量对象进行操作时。
# 使用 lambda 函数进行相同的排序 users_sorted_by_age = sorted(users, key=lambda user: user.age)
attrgetter 通常比 lambda 更具可读性,特别是在处理复杂对象属性时。
operator.itemgetter
operator.itemgetter 是 Python 标准库 operator 模块中的一个工具,用于创建一个可调用对象,该对象可以从其操作数中获取指定的元素。它常用于从序列(如列表、元组)或映射(如字典)中提取元素,特别是在需要对数据进行排序、分组或筛选时。
基本用法
from operator import itemgetter
# 使用 itemgetter 获取列表的元素
data = [(1, 'a'), (2, 'b'), (3, 'c')]
# 获取每个元组的第一个元素
first_element_getter = itemgetter(0)
for item in data:
print(first_element_getter(item))
# 输出:
# 复制代码
# 1
# 2
# 3
对字典进行操作
itemgetter 也可以用于从字典中提取值:
from operator import itemgetter
# 使用 itemgetter 获取字典的值
data = [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 35}]
# 获取每个字典的 'age' 值
age_getter = itemgetter('age')
for item in data:
print(age_getter(item))
# 输出:
# 30
# 25
# 35
获取多个元素
可以通过传递多个索引或键来获取多个元素:
from operator import itemgetter
# 使用itemgetter获取多个元素
data = [(1, 'a', 100), (2, 'b', 200), (3, 'c', 300)]
# 获取每个元组的第一个和第三个元素
first_and_third_getter = itemgetter(0, 2)
for item in data:
print(first_and_third_getter(item))
# 输出:
# (1, 100)
# (2, 200)
# (3, 300)
应用场景
- 排序: itemgetter 常用于对数据列表进行排序,例如按列表中元组的某个元素排序。
- 分组: 在分组操作中,可以使用 itemgetter 来提取用于分组的关键元素。
- 筛选: 在筛选数据时,可以使用 itemgetter 提取需要检查的元素。
与 lambda 的对比
虽然可以使用lambda函数实现类似的功能,但itemgetter通常更简洁且性能更好,特别是在需要对大量数据进行操作时。
# 使用lambda函数进行相同的操作 sorted_data = sorted(data, key=lambda x: x[0])
itemgetter通常比lambda更具可读性,特别是在处理复杂数据结构时。
operator.methodcaller
operator.methodcaller是Python标准库operator模块中的一个工具,用于创建一个可调用对象,该对象能够调用给定对象的方法。这对于需要在多个地方重复调用同一方法的情况非常有用,尤其是在处理数据结构的转换、过滤和排序时。
基本用法
from operator import methodcaller
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
users = [User('Alice', 30), User('Bob', 25), User('Charlie', 35)]
# 使用methodcaller调用get_name方法
get_name = methodcaller('get_name')
for user in users:
print(get_name(user))
# 输出:
# Alice
# Bob
# Charlie
传递参数
methodcaller还可以用来传递参数给方法:
from operator import methodcaller
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self, greeting):
return f"{greeting}, my name is {self.name}"
users = [User('Alice', 30), User('Bob', 25), User('Charlie', 35)]
# 使用methodcaller并传递参数
introduce_with_greeting = methodcaller('introduce', 'Hello')
for user in users:
print(introduce_with_greeting(user))
# 输出:
# Hello, my name is Alice
# Hello, my name is Bob
# Hello, my name is Charlie
应用场景
- 排序: methodcaller 可以用于根据对象的方法结果对列表进行排序。
- 数据转换: 当需要对数据结构中的元素进行统一的方法调用时。
- 数据筛选: 在数据筛选过程中,可以使用 methodcaller 来调用特定方法并根据其结果进行筛选。
与 lambda 的对比
虽然可以使用lambda函数实现类似的功能,但methodcaller通常更简洁且性能更好,特别是在需要对大量对象进行操作时。
# 使用lambda函数进行相同的调用
introduce_with_greeting_lambda = lambda user: user.introduce('Hello')
for user in users:
print(introduce_with_greeting_lambda(user))
methodcaller通常比lambda更具可读性,特别是在处理复杂对象方法调用时。
逻辑操作符函数
这些函数对应于逻辑操作符。
- truth(a):返回bool(a),用于测试a的布尔值
- is_(a, b):返回 a is b
- is_not(a, b):返回 a is not b
参考链接:



