Python中operator模块的操作符使用示例总结
operator模块是python中内置的操作符函数接口,它定义了一些算术和比较内置操作的函数。operator模块是用c实现的,所以执行速度比python代码快。
逻辑操作
fromoperatorimport* a=[1,2,3] b=a print'a=',a print'b=',b print print'not_(a):',not_(a) print'truth(a):',truth(a) print'is_(a,b):',is_(a,b) print'is_not(a,b):',is_not(a,b)
打印结果:
a=[1,2,3] b=[1,2,3] not_(a):False truth(a):True is_(a,b):True is_not(a,b):False
可以通过结果知道,operator的一些操作函数与原本的运算是相同的。
比较操作符
operator提供丰富的比较操作。
a=3 b=5 print'a=',a print'b=',b print forfuncin(lt,le,eq,ne,ge,gt): print'{0}(a,b):'.format(func.__name__),func(a,b)
打印结果
a=3 b=5 lt(a,b):True le(a,b):True eq(a,b):False ne(a,b):True ge(a,b):False gt(a,b):False
这些函数等价于<、<=、==、>=和>的表达式语法。
算术操作符
处理数字的算术操作符也得到支持。
a,b,c,d=-1,2,-3,4 print'a=',a print'b=',b print'c=',c print'd=',d print'\nPositive/Negative:' print'abs(a):',abs(a) print'neg(a):',neg(a) print'neg(b):',neg(b) print'pos(a):',pos(a) print'pos(b):',pos(b)
打印结果
a=-1 b=2 c=-3 d=4 Positive/Negative: abs(a):1 neg(a):1 neg(b):-2 pos(a):-1 pos(b):2
abs返回值得绝对值,neg返回(-obj),pos返回(+obj)。
a=-2 b=5.0 print'a=',a print'b=',b print'\nArithmetic' print'add(a,b):',add(a,b) print'div(a,b):',div(a,b) print'floordiv(a,b):',floordiv(a,b) print'mod(a,b):',mod(a,b) print'mul(a,b):',mul(a,b) print'pow(a,b):',pow(a,b) print'sub(a,b):',sub(a,b) print'truediv(a,b):',truediv(a,b)
打印结果
a=-2 b=5.0 Arithmetic add(a,b):3.0 div(a,b):-0.4 floordiv(a,b):-1.0 mod(a,b):3.0#查看负数取模 mul(a,b):-10.0 pow(a,b):-32.0 sub(a,b):-7.0 truediv(a,b):-0.4
mod表示取模,mul表示相乘,pow是次方,sub表示相减
a=2 b=6 print'a=',a print'b=',b print'\nBitwise:' print'and_(a,b):',and_(a,b) print'invert(a):',invert(a) print'lshift(a,b):',lshift(a,b) print'or_(a,b):',or_(a,b) print'rshift(a,b):',rshift(a,b) print'xor(a,b):',xor(a,b)
打印结果
a=2 b=6 Bitwise: and_(a,b):2 invert(a):-3 lshift(a,b):128 or_(a,b):6 rshift(a,b):0 xor(a,b):4
and表示按位与,invert表示取反操作,lshift表示左位移,or表示按位或,rshift表示右位移,xor表示按位异或。
原地操作符
即in-place操作,x+=y等同于x=iadd(x,y),如果复制给其他变量比如z=iadd(x,y)等同与z=x;z+=y。
a=3 b=4 c=[1,2] d=['a','b'] print'a=',a print'b=',b print'c=',c print'd=',d print a=iadd(a,b) print'a=iadd(a,b)=>',a print c=iconcat(c,d) print'c=iconcat(c,d)=>',c
属性和元素的获取方法
operator模块最特别的特性之一就是获取方法的概念,获取方法是运行时构造的一些可回调对象,用来获取对象的属性或序列的内容,获取方法在处理迭代器或生成器序列的时候特别有用,它们引入的开销会大大降低lambda或Python函数的开销。
fromoperatorimport* classMyObj(object): def__init__(self,arg): super(MyObj,self).__init__() self.arg=arg def__repr__(self): return'MyObj(%s)'%self.arg objs=[MyObj(i)foriinxrange(5)] print"Object:",objs g=attrgetter("arg") vals=[g(i)foriinobjs] print"argvalues:",vals objs.reverse() print"reversed:",objs print"sorted:",sorted(objs,key=g)
结果:
Object:[MyObj(0),MyObj(1),MyObj(2),MyObj(3),MyObj(4)] argvalues:[0,1,2,3,4] reversed:[MyObj(4),MyObj(3),MyObj(2),MyObj(1),MyObj(0)] sorted:[MyObj(0),MyObj(1),MyObj(2),MyObj(3),MyObj(4)]
属性获取方法类似于
lambdax,n='attrname':getattr(x,nz)
元素获取方法类似于
lambdax,y=5:x[y]
fromoperatorimport* l=[dict(val=-1*i)foriinxrange(4)] print"dictionaries:",l g=itemgetter("val") vals=[g(i)foriinl] print"values:",vals print"sorted:",sorted(l,key=g) l=[(i,i*-2)foriinxrange(4)] print"tuples:",l g=itemgetter(1) vals=[g(i)foriinl] print"values:",vals print"sorted:",sorted(l,key=g)
结果如下:
dictionaries:[{'val':0},{'val':-1},{'val':-2},{'val':-3}] values:[0,-1,-2,-3] sorted:[{'val':-3},{'val':-2},{'val':-1},{'val':0}] tuples:[(0,0),(1,-2),(2,-4),(3,-6)] values:[0,-2,-4,-6] sorted:[(3,-6),(2,-4),(1,-2),(0,0)]
除了序列之外,元素获取方法还适用于映射。
结合操作符和定制类
operator模块中的函数通过相应操作的标准Python接口完成工作,所以它们不仅适用于内置类型,还适用于用户自定义类型。
fromoperatorimport* classMyObj(object): def__init__(self,val): super(MyObj,self).__init__() self.val=val return def__str__(self): return"MyObj(%s)"%self.val def__lt__(self,other): returnself.val<other.val def__add__(self,other): returnMyObj(self.val+other.val) a=MyObj(1) b=MyObj(2) printlt(a,b) printadd(a,b)
结果如下所示:
True MyObj(3)
类型检查
operator模块还包含一些函数用来测试映射、数字和序列类型的API兼容性。
fromoperatorimport* classNoType(object): pass classMultiType(object): def__len__(self): return0 def__getitem__(self,name): return"mapping" def__int__(self): return0 o=NoType() t=MultiType() forfuncin[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可以获取对象的方法。
fromoperatorimportmethodcaller classStudent(object): def__init__(self,name): self.name=name defgetName(self): returnself.name stu=Student("Jim") func=methodcaller('getName') printfunc(stu)#输出Jim
还可以给方法传递参数:
f=methodcaller('name','foo',bar=1) f(b)#returnb.name('foo',bar=1) methodcaller方法等价于下面这个函数: defmethodcaller(name,*args,**kwargs): defcaller(obj): returngetattr(obj,name)(*args,**kwargs) returncaller