python 学习汇总54:operator模块(全 推荐- tcy)
发布日期:2021-06-29 14:47:15 浏览次数:3 分类:技术文章

本文共 5312 字,大约阅读时间需要 17 分钟。

本人汇总网上各种资料,经整理调试,补充,以上例程全部通过iPython3.7.比较复杂的案例本人没有采用,仅仅以简单实例,说明基本的使用方法,由于函数较多,每一类都至少有一个实例。请慢慢查看。。。有点多
python operator模块 2018/11/19  
用途:该operator模块导出一组与Python的内部运算符相对应的高效函数。可用于itertools工具包中的函数,重载;也可直接运用。特点operator模块是python中内置的操作符函数接口,它定义了一些算术和比较内置操作的函数。operator模块是用c实现的,所以执行速度比python代码快。 

实例 :

# 0. 逻辑操作operator.truth(2)# True# 1.比较操作符operator.lt(1,5) #True
2.算术操作符: 
# 2.1 算术操作add(1,2)  #3operator.abs(-1)  #1# 2.2.位操作operator.or_(4,8) #12 
3.序列操作符: # 3.1. 建立序列a = [1,2,3]b = ['a', 'b', 'c']operator.concat(a,b)  #[1, 2, 3, 'a', 'b', 'c']# 3.2.搜索序列operator.contains(a,1)  #Trueoperator.contains(b,"d")  # Falseoperator.countOf(b,"c")  #1operator.indexOf(a,1)  #0# 3.3.访问序列operator.getitem(b,1)  # 'b'operator.getslice(a,1,3)  # [2, 3]operator.setitem(b,1,'d')b  # ['a', 'd', 'c']operator.setslice(a,1,3,[4,5])a # [1, 4, 5]原地修改序列,而不会返回值# 3.4.从序列中删除元素operator.delitem(b,1)b # ['a', 'c']原地修改序列,而不会返回值
 
4.原地操作符: # 实例1:# 字符串数字元组不可变目标,计算更新值,不会将其分配回输入变量:a =  'hello'iadd(a, ' world')  #'hello world'a  #'hello'a=iadd(a, ' world') #a='hello world'是将a重新赋值# 实例2:# 列表和字典可变目标,inplace方法将执行更新,因此不需要后续分配:s = ['h','e','l','l','o']iadd(s, [' ','w','o','r','l','d'])  #['h','e','l','l','o',' ','w','o','r','l','d']s #['h','e','l','l','o',' ','w','o','r','l','d']
 
5.属性和元素的获取方法总结:    itemgetter 是以类似a[index]的形式来获取相对应的值。    attrgetter是以类似 a.name属性的方式来获取相对应的值。: 
特点:operator模块最特别的特性之一就是获取方法的概念,获取方法是运行时构造的一些可回调对象,用来获取对象的属性或序列的内容,获取方法在处理迭代器或生成器序列的时候特别有用,它们引入的开销会大大降低lambda或Python函数的开销
5.1.operator.itemgetter(item1,item2,...)(obj) ==> obj[item1],obj[item2],...#返回可调用对象,用操作数方法从其操作数中获取项__getitem__():
# 实例1:元组a=(1,2,3)ig=operator.itemgetter(1,2)operator.itemgetter(1, 2)ig(a)  # (2, 3)# 实例2:元组a = [('apple',3),('banana',2),('pear',5),('orange', 1)]ig = operator.itemgetter(1)ig(a)  #('banana', 2)list(map(ig, a))  #[3, 2, 5, 1]sorted(a, key=ig)  #[('orange',1),('banana',2), ('apple',3),('pear', 5)]# 实例3:str或lists='ABCDEFG'f =operator.itemgetter(1)(s)  #'B'f1=operator.itemgetter(1,3,5)(s)  #('B', 'D', 'F') call f1(s) returns s[1],s[3],s[5]operator.itemgetter(slice(2,None))(s)  #'CDEFG'# 实例4:字典d={'k1':11,'k2':22}operator.itemgetter('k1')(d)  #11# 实例5:字典d = dict(name='Tom', age=30)  #{'name': 'Tom', 'age': 30}operator.itemgetter('name','age')(d) # ('Tom', 30)
5.2.operator.attrgetter(‘属性或方法名1’,....) (实例)(参数)#返回可调用对象,该对象从其操作数中获取attr。请求多个属性返回属性元组:
#实例1:元祖from collections import namedtupleSize=namedtuple('Size',['x','y','long','width','heigh'])a=Size(0.1,0.2,30,40,50)getattr(a,'x')  #0.1operator.attrgetter('x')(a)# 0.1# 实例2:dict,list#字典UserDict,列表UserList用attrgetter类似处理,不在举例。# 实例3:类属性方法class MyObj(object):def __init__(self, arg):super(MyObj, self).__init__()self.arg = argdef __repr__(self):return 'MyObj(%s)' % self.argdef add(self,x,y):return x+ya=MyObj(11)a.arg #11 #一般方法获取类属性a.add(2,3) #5 #一般方法获取类方法getattr(a, 'arg') #11 # 用getattr方法获取类属性operator.attrgetter('arg')(a)#11 # 用attrgetter方法获取类属性getattr(a,'add')(2,3)#5 # 用getattr方法获取类方法operator.attrgetter('add')(a)(2,3)# 5 # 用attrgetter方法获取类方法
6.结合操作符和定制类这个转载其他网页,不知是否正确,欢迎大侠补全。是否是operator.__it__?# operator模块中的函数通过标准Python接口完成工作,适用于内置类型,还用户自定义类型:import operator as operatorclass MyObj(object):def __init__(self, val):super(MyObj, self).__init__()self.val = valreturn def __str__(self):return "MyObj(%s)" % self.valdef __lt__(self, other):return self.val < other.valdef __add__(self, other):return MyObj(self.val + other.val)a = MyObj(1)b = MyObj(2)operator.lt(a, b)  # Trueoperator.add(a,b)# MyObj(3)7.类型检查 新版本中已经查不到啦。
 
8.获取对象方法使用methodcaller可以获取对象的方法:
class Student(object):def __init__(self, name):self.name = namedef getName(self):return self.namedef add(self,x,y):return x+ystu = Student("Jim")func = operator.methodcaller('getName')func(stu) # 'Jim' #获取无参数的方法funadd = operator.methodcaller('add',2,3)#传递参数的方法funadd(stu)#5
9.operator 模块为 Python 提供了一个 "功能性" 的标准操作符接口. 当使用 ``map``  以及filter 一类的函数的时候 ,operator 模块中的函数可以替换一些 ``lambda`` 函式.:sequence = 1, 2, 4 functools.reduce(operator.add, sequence)#7

10函数汇总表 

 

类别 Operation Syntax Function remark
比较 相等 a == b eq(a, b)  
比较   a >= b ge(a, b)  
比较   a > b gt(a, b)  
比较   a <= b le(a, b)  
比较   a < b lt(a, b)  
比较   a != b ne(a, b)  
逻辑 身份 a is b is_(a, b) 注1
逻辑 身份 a is not b is_not(a, b)  
逻辑 否定 逻辑 not a not_(a)  
逻辑 真相测试 obj truth(obj) #bool(obj)
其他     all 显示所有属性方法
其他     inv(obj)  
其他 可调用对象   methodcaller(name [,args ... ]  
算数 绝对值   abs(obj)   
算数 加成 a + b add(a, b) 支持就地操作
算数 a // b floordiv(a, b) 支持就地操作
算数 矩阵乘法 a @ b matmul(a, b) 支持就地操作
算数 a % b mod(a, b) 支持就地操作
算数 乘法 a * b mul(a, b) 支持就地操作
算数 否定 算术 - a neg(a)  
算数 + a pos(a)  
算数 a ** b pow(a, b) 支持就地操作
算数 减法 a - b sub(a, b) 支持就地操作
算数 真正除法  a / b truediv(a, b) 2/3是.66支持就地操作
按位和 a & b and_(a, b) 支持就地操作
按位反转 ~ a invert(a)  
左移b a << b lshift(a, b) 支持就地操作
按位或 a | b or_(a, b) 支持就地操作
右移位 a >> b rshift(a, b) 支持就地操作
按位异或 a ^ b xor(a, b) 支持就地操作
序列     attrgetter(attr)  .attrgetter(* attrs)
序列 级联 seq1 + seq2 concat(seq1, seq2) 支持就地操作
序列 遏制测试 obj in seq contains(seq, obj) #返回测试结果
序列     countOf(a,b)  返回出现次数b中的一个
序列 索引删除 del obj[k] delitem(obj, k)  
序列 切片删除 del seq[i:j] delitem(seq, slice(i, j))  
序列 索引 obj[k] getitem(obj, k)  
序列 切片 seq[i:j] getitem(seq, slice(i, j))  
序列     index(a)  
序列 第一个索引   indexOf(a,b)   
序列     itemgetter(items) .itemgetter(*items)
序列 对象长度   length_hint(obj,默认= 0)   
序列 索引分配 obj[k] = v setitem(obj, k, v)  
序列 切片分配 seq[i:j] = values setitem(seq, slice(i, j), values)  
注1: 通常也适用于所有对象,并支持真值测试,身份测试和布尔操作

转载地址:https://chunyou.blog.csdn.net/article/details/84212749 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python 学习汇总55:序列字典排序汇总sorted,heapq(查找最小值),bisect ,numpy.searchsorted(二分法排序)(- tcy)
下一篇:python 学习汇总53:闭包(中级学习- tcy)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月06日 01时58分54秒