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
参考链接: