器→工具, 编程语言

Python标准库之operator

钱魏Way · · 20 次浏览

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

参考链接:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注