每周一个 Python 模块 | operator

简介: operator 模块是 Python 中内置的操作符函数接口,它定义了算术,比较和与标准对象 API 相对应的其他操作的内置函数。operator 模块是用 C 实现的,所以执行速度比 Python 代码快。

operator 模块是 Python 中内置的操作符函数接口,它定义了算术,比较和与标准对象 API 相对应的其他操作的内置函数。

operator 模块是用 C 实现的,所以执行速度比 Python 代码快。


逻辑运算


from operator import *
a = -1
b = 5
print('a =', a)
print('b =', b)
print()
print('not_(a)     :', not_(a))       # False
print('truth(a)    :', truth(a))    # True    
print('is_(a, b)   :', is_(a, b))   # False
print('is_not(a, b):', is_not(a, b))  # True
复制代码


not_()包括尾随下划线,因为not 是 Python 的关键字。 truth()作为判断表达式用在if语句中,或者将一个表达式转换成boolis_()is关键字的用法一样,is_not()用法相同,只不过返回相反的答案。


比较运算符


from operator import *
a = 1
b = 5.0
print('a =', a)
print('b =', b)
for func in (lt, le, eq, ne, ge, gt):
    print('{}(a, b): {}'.format(func.__name__, func(a, b)))
# a = 1
# b = 5.0
# lt(a, b): True
# le(a, b): True
# eq(a, b): False
# ne(a, b): True
# ge(a, b): False
# gt(a, b): False    
复制代码


功能是等同于使用表达式语法<<===>=,和>


算术运算符


from operator import *
a = -1
b = 5.0
c = 2
d = 6
print('\nPositive/Negative:')
print('abs(a):', abs(a))  # abs(a): 1
print('neg(a):', neg(a))  # neg(a): 1
print('neg(b):', neg(b))  # neg(b): -5.0
print('pos(a):', pos(a))  # pos(a): -1
print('pos(b):', pos(b))  # pos(b): 5.0
print('\nArithmetic:')
print('add(a, b)     :', add(a, b))     # add(a, b)     : 4.0
print('floordiv(a, b):', floordiv(a, b))  # floordiv(a, b): -1.0
print('floordiv(d, c):', floordiv(d, c))  # floordiv(d, c): 3
print('mod(a, b)     :', mod(a, b))     # mod(a, b)     : 4.0
print('mul(a, b)     :', mul(a, b))     # mul(a, b)     : -5.0
print('pow(c, d)     :', pow(c, d))     # pow(c, d)     : 64
print('sub(b, a)     :', sub(b, a))     # sub(b, a)     : 6.0
print('truediv(a, b) :', truediv(a, b))   # truediv(a, b) : -0.2
print('truediv(d, c) :', truediv(d, c))   # truediv(d, c) : 3.0
print('\nBitwise:')
print('and_(c, d)  :', and_(c, d))    # and_(c, d)  : 2   
print('invert(c)   :', invert(c))   # invert(c)   : -3
print('lshift(c, d):', lshift(c, d))  # lshift(c, d): 128
print('or_(c, d)   :', or_(c, d))   # or_(c, d)   : 6
print('rshift(d, c):', rshift(d, c))  # rshift(d, c): 1
print('xor(c, d)   :', xor(c, d))   # xor(c, d)   : 4
复制代码


序列运算符


使用序列的运算符可以分为四组:构建序列,搜索项目,访问内容以及从序列中删除项目。


from operator import *
a = [1, 2, 3]
b = ['a', 'b', 'c']
print('\nConstructive:')
print('  concat(a, b):', concat(a, b))    # concat(a, b): [1, 2, 3, 'a', 'b', 'c']
print('\nSearching:')
print('  contains(a, 1)  :', contains(a, 1))  # contains(a, 1)  : True
print('  contains(b, "d"):', contains(b, "d"))  # contains(b, "d"): False
print('  countOf(a, 1)   :', countOf(a, 1))   # countOf(a, 1)   : 1
print('  countOf(b, "d") :', countOf(b, "d")) # countOf(b, "d") : 0
print('  indexOf(a, 5)   :', indexOf(a, 1))   # indexOf(a, 5)   : 0
print('\nAccess Items:')
print(getitem(b, 1))  # b
print(getitem(b, slice(1, 3))) # ['b', 'c']
print(setitem(b, 1, "d")  # None
print(b)  # ['a', 'd', 'c']
print(setitem(a, slice(1, 3), [4, 5]))  # None
print(a)  # [1, 4, 5]
print('\nDestructive:')
print(delitem(b, 1))  # None
print(b)  # ['a', 'c']
print(delitem(a, slice(1, 3)) # None
print(a)  # [1]
复制代码


其中一些操作(例如setitem()delitem())修改了序列并且不返回值。


原地操作符


除了标准运算符之外,许多类型的对象还支持通过特殊运算符进行“原地”修改 ,+=同样具有就地修改的功能:


from operator import *
a = -1
b = 5.0
c = [1, 2, 3]
d = ['a', 'b', 'c']
a = iadd(a, b)
print('a = iadd(a, b) =>', a) # a = iadd(a, b) => 4.0
c = iconcat(c, d)
print('c = iconcat(c, d) =>', c)  # c = iconcat(c, d) => [1, 2, 3, 'a', 'b', 'c']
复制代码


属性和元素的获取方法


operator 模块最特别的特性之一就是获取方法的概念,获取方法是运行时构造的一些可回调对象,用来获取对象的属性或序列的内容,获取方法在处理迭代器或生成器序列的时候特别有用,它们引入的开销会大大降低 lambda 或 Python 函数的开销。


from operator import *
class MyObj:
    """example class for attrgetter"""
    def __init__(self, arg):
        super().__init__()
        self.arg = arg
    def __repr__(self):
        return 'MyObj({})'.format(self.arg)
l = [MyObj(i) for i in range(5)]
print(l)  # [MyObj(0), MyObj(1), MyObj(2), MyObj(3), MyObj(4)]
# Extract the 'arg' value from each object
g = attrgetter('arg')
vals = [g(i) for i in l]
print('arg values:', vals)  # arg values: [0, 1, 2, 3, 4]
# Sort using arg
l.reverse()
print(l)  # [MyObj(4), MyObj(3), MyObj(2), MyObj(1), MyObj(0)]
print(sorted(l, key=g)) # [MyObj(0), MyObj(1), MyObj(2), MyObj(3), MyObj(4)]
复制代码


结合操作符和定制类


operator模块中的函数通过标准 Python 接口进行操作,因此它可以使用用户定义的类以及内置类型。


from operator import *
class MyObj:
    """Example for operator overloading"""
    def __init__(self, val):
        super(MyObj, self).__init__()
        self.val = val
    def __str__(self):
        return 'MyObj({})'.format(self.val)
    def __lt__(self, other):
        """compare for less-than"""
        print('Testing {} < {}'.format(self, other))
        return self.val < other.val
    def __add__(self, other):
        """add values"""
        print('Adding {} + {}'.format(self, other))
        return MyObj(self.val + other.val)
a = MyObj(1)
b = MyObj(2)
print('Comparison:')
print(lt(a, b))   
# Comparison:
# Testing MyObj(1) < MyObj(2)
# True
print('\nArithmetic:')
print(add(a, b))  
# Arithmetic:
# Adding MyObj(1) + MyObj(2)
# MyObj(3)
复制代码


类型检查


operator 模块还包含一些函数用来测试映射、数字和序列类型的 API 兼容性。


from operator import *
class NoType(object):
    pass
class MultiType(object):
    def __len__(self):
        return 0
    def __getitem__(self, name):
        return "mapping"
    def __int__(self):
        return 0
o = NoType()
t = MultiType()
for func in [isMappingType, isNumberType, isSequenceType]:
    print "%s(o):" % func.__name__, func(o)
    print "%s(t):" % func.__name__, func(t)
# isMappingType(o): False
# isMappingType(t): True
# isNumberType(o): False
# isNumberType(t): True
# isSequenceType(o): False
# isSequenceType(t): True    
复制代码


获取对象方法


使用 methodcaller 可以获取对象的方法。


from operator import methodcaller
class Student(object):
    def __init__(self, name):
        self.name = name
    def getName(self):
        return self.name
stu = Student("Jim")
func = methodcaller('getName')
print func(stu)   # 输出Jim
复制代码


还可以给方法传递参数:


f = methodcaller('name', 'foo', bar=1)
f(b)    # return   b.name('foo', bar=1)
复制代码


methodcaller方法等价于下面这个函数:


def methodcaller(name, *args,  **kwargs):
      def caller(obj):
            return getattr(obj, name)(*args, **kwargs)
      return caller


目录
相关文章
|
9月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
1005 7
|
9月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
752 0
|
9月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
715 4
|
10月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
277 4
|
9月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
789 0
|
9月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
1242 0
|
10月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
813 0
|
11月前
|
存储 安全 数据处理
Python 内置模块 collections 详解
`collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
624 0
|
12月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录

推荐镜像

更多