ZetCode

Python operator 模块

最后修改:2025 年 2 月 15 日

在本文中,我们将介绍如何在 Python 中使用 operator 模块。operator 模块提供了与 Python 运算符对应的函数。当您需要将运算符用作函数参数时,例如与 mapfilter 一起使用时,它特别有用。

operator 模块是 Python 标准库的一部分,因此无需额外安装。

operator 的基本用法

下面的示例演示了如何使用 operator 模块执行算术运算。

main.py
import operator

a = 10
b = 3

print("Addition:", operator.add(a, b))
print("Subtraction:", operator.sub(a, b))
print("Multiplication:", operator.mul(a, b))
print("Division:", operator.truediv(a, b))

在此程序中,使用 operator.addoperator.suboperator.muloperator.truediv 函数执行相应的算术运算。

$ python main.py
Addition: 13
Subtraction: 7
Multiplication: 30
Division: 3.3333333333333335

比较运算符

下面的示例演示了如何使用 operator 模块执行比较。

main.py
import operator

a = 10
b = 3

print("Equal:", operator.eq(a, b))
print("Not Equal:", operator.ne(a, b))
print("Greater Than:", operator.gt(a, b))
print("Less Than:", operator.lt(a, b))
print("Greater Than or Equal:", operator.ge(a, b))
print("Less Than or Equal:", operator.le(a, b))

在此程序中,使用 operator.eqoperator.neoperator.gtoperator.ltoperator.geoperator.le 函数执行相应的比较。

$ python main.py
Equal: False
Not Equal: True
Greater Than: True
Less Than: False
Greater Than or Equal: True
Less Than or Equal: False

逻辑运算符

下面的示例演示了如何使用 operator 模块执行逻辑运算。

main.py
import operator

account_balance = 1000

withdrawal_amount = 500
deposit_amount = 200

if operator.ge(account_balance, withdrawal_amount):
    print("Withdrawal successful. New balance:", account_balance - withdrawal_amount)
else:
    print("Insufficient balance for withdrawal.")

if operator.ge(account_balance, deposit_amount):
    print("Deposit successful. New balance:", account_balance + deposit_amount)
else:
    print("Error: Deposit amount exceeds account balance.")

if operator.eq(account_balance, 0):
    print("Account balance is zero.")
else:
    print("Account balance is not zero.")

if operator.ne(account_balance, 0):
    print("Account balance is not zero.")
else:
    print("Account balance is zero.")

在此示例中,我们使用 operator 模块对账户余额执行各种比较。

我们使用这些运算符来检查账户余额是否足以进行某些交易,例如提款和存款。我们还使用它们来检查账户余额是否为零或不为零。

$ python main.py
And: 2
Or: 11
Not: -11

位运算符

下面的示例演示了如何使用 operator 模块执行位运算。

main.py
import operator

READ = 0b0001  # 1
WRITE = 0b0010  # 2
EXECUTE = 0b0100  # 4

user_permissions = READ | WRITE

has_read = operator.and_(user_permissions, READ) != 0
print("Has read permission:", has_read)

has_execute = operator.and_(user_permissions, EXECUTE) != 0
print("Has execute permission:", has_execute)

user_permissions = operator.or_(user_permissions, EXECUTE)
print("Added execute permission:", bin(user_permissions))

user_permissions = operator.and_(user_permissions, operator.not_(WRITE))
print("Removed write permission:", bin(user_permissions))

user_permissions = operator.xor(user_permissions, READ)
print("Toggled read permission:", bin(user_permissions))

在此程序中,我们使用 operator 模块在具有位运算符的假设用户权限系统中操作标志和权限。

READ = 0b0001  # 1
WRITE = 0b0010  # 2
EXECUTE = 0b0100  # 4

我们将一些权限定义为位掩码。

has_read = operator.and_(user_permissions, READ) != 0
print("Has read permission:", has_read)

我们检查用户是否具有读取权限。

has_execute = operator.and_(user_permissions, EXECUTE) != 0
print("Has execute permission:", has_execute)

在这里,我们检查用户是否具有执行权限。

user_permissions = operator.or_(user_permissions, EXECUTE)
print("Added execute permission:", bin(user_permissions))

我们将执行权限添加到用户。

user_permissions = operator.and_(user_permissions, operator.not_(WRITE))
print("Removed write permission:", bin(user_permissions))

我们从用户那里删除写入权限。

user_permissions = operator.xor(user_permissions, READ)
print("Toggled read permission:", bin(user_permissions))

最后,我们切换读取权限(如果用户有,则删除;如果没有,则添加)。

$ python main.py
Has read permission: True
Has execute permission: False
Added execute permission: 0b111
Removed write permission: 0b0
Toggled read permission: 0b1

从对象中检索项

operator 模块提供了访问序列和字典中元素的方法。

main.py
import operator

my_list = [1, 2, 3, 4, 5]
get_second = operator.itemgetter(1)
print(get_second(my_list))

my_dict = {'a': 10, 'b': 20, 'c': 30}
get_value = operator.itemgetter('b')
print(get_value(my_dict))

该示例演示了如何使用 operator.itemgetter 从列表和字典中提取特定项。

get_second = operator.itemgetter(1)
print(get_second(my_list))

operator.itemgetter(1) 创建一个可调用对象,该对象从其操作数中获取索引为 1 的项。get_second(my_list) 使用 my_list 作为参数调用此可调用对象。它从 my_list 中检索第二个元素,即 2。

get_value = operator.itemgetter('b')
print(get_value(my_dict))

operator.itemgetter('b') 创建一个可调用对象,该对象从其操作数中获取与键 'b' 关联的值。get_value(my_dict) 使用 my_dict 作为参数调用此可调用对象。它检索与键 'b' 关联的值,即 20。

使用 itemgetter 进行排序

根据特定元素对元组列表进行排序是一项常见任务。itemgetter 函数从每个元组中提取特定索引,从而可以轻松地根据该值进行排序。

main.py
from operator import itemgetter

students = [("John", 85), ("Jane", 90), ("Dave", 80)]
sorted_students = sorted(students, key=itemgetter(1), reverse=True)
print(sorted_students)

该示例按第二个元组项对元组列表进行排序。

$ python main.py
[("Jane", 90), ("John", 85), ("Dave", 80)]

使用 methodcaller 进行映射

当对对象列表应用相同的方法时,methodcaller 函数很有用。我们可以使用 methodcaller 来调用列表中每个元素的 upper 等方法,而不是使用 lambda 函数。

main.py
from operator import methodcaller

words = ["an", "old", "falcon"]
upper_words = list(map(methodcaller("upper"), words))
print(upper_words)

该示例将 upper 方法应用于列表中的每个元素。

$ python main.py
["AN", "OLD", "FALCON"]

使用 attrgetter 进行过滤

在处理对象时,使用 attrgetter 可以简化基于属性过滤元素的操作。attrgetter 提供了一种更简洁、更易读的方法,而不是使用 lambda 函数来访问属性。

main.py
from operator import attrgetter

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person("Alice", 30), Person("Bob", 25), Person("Charlie", 35)]
adults = list(filter(lambda p: attrgetter("age")(p) >= 30, people))
print([(p.name, p.age) for p in adults])

在示例中,我们按年龄过滤用户;我们选择所有年龄大于或等于 30 的用户。

$ python main.py
[("Alice", 30), ("Charlie", 35)]

来源

Python 运算符 - 文档

在本文中,我们介绍了如何在 Python 中使用 operator 模块进行运算符操作。operator 模块是任何 Python 程序员的有用工具。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程