1.operator
我这里主要可能介绍的是python3.X版本的,会和python2.X版本有点不一致,具体的细节很多,小伙伴们遇到问题还请自行百度吧,LZ也没有足够的能力能够涵盖到所有的问题,只能把我自己遇到的一些问题分享出来,避免小伙伴们再走一遍弯路!
#coding:utf-8fromoperatorimport*#逻辑操作符(operator的一些操作函数与原本的运算是相同的)a=[1,2,3]b=aprint('a =',a)print('b =',b)printprint('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=3b=5print('a =',a)print('b =',b)printforfuncin(lt,le,eq,ne,ge,gt):print('{0}(a, b):'.format(func.__name__),func(a,b))#算术操作符(abs返回值得绝对值,neg返回(-obj), pos返回(+obj))a,b,c,d=-1,2,-3,4print('a =',a)print('b =',b)print('c =',c)print('d =',d)print('\nPositive/Negative:')print('abs(a):',neg(a))print('neg(b):',neg(b))print('pos(a):',pos(a))print('pos(b):',pos(b))#mod表示取模, mul 表示相乘,pow是次方, sub表示相减a=-2b=5.0print('a =',a)print('b =',b)print('\nArithmetic')print('add(a, b):',add(a,b))print('div(a, b):',divmod(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))#and 表示按位与, invert 表示取反操作, lshift表示左位移, or表示按位或, rshift表示右位移,xor表示按位异或。a=2b=6print('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))#原地操作符#即in-place操作, x += y 等同于 x = iadd(x, y), 如果复制给其他变量比如z = iadd(x, y)等同与z = x; z += ya=3b=4c=[1,2]d=['a','b']print('a =',a)print('b =',b)print('c =',c)print('d =',d)printa=iadd(a,b)print('a = iadd(a, b) =>',a)printc=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=argdef__repr__(self):return'MyObj(%s)'%self.arg objs=[MyObj(i)foriinrange(5)]print("Object:",objs)g=attrgetter("arg")vals=[g(i)foriinobjs]print("arg values:",vals)objs.reverse()print("reversed:",objs)print("sorted:",sorted(objs,key=g))#属性获取方法类似于:lambda x, n='attrname':getattr(x,nz)fromoperatorimport*l=[dict(val=-1*i)foriinrange(4)]print("dictionaries:",l)g=itemgetter("val")vals=[g(i)foriinl]print("values: ",vals)print("sorted:",sorted(l,key=g))l=[(i,i*-2)foriinrange(4)]print("tuples: ",l)g=itemgetter(1)vals=[g(i)foriinl]print("values:",vals)print("sorted:",sorted(l,key=g))#结合操作符和定制类#operator模块中的函数通过相应操作的标准Python接口完成工作,所以它们不仅适用于内置类型,还适用于用户自定义类型fromoperatorimport*classMyObj(object):def__init__(self,val):super(MyObj,self).__init__()self.val=valreturndef__str__(self):return"MyObj(%s)"%self.valdef__lt__(self,other):returnself.val<other.valdef__add__(self,other):returnMyObj(self.val+other.val)a=MyObj(1)b=MyObj(2)print(lt(a,b))print(add(a,b))#类型检查#operator 模块还包含一些函数用来测试映射、数字和序列类型的API兼容性#python2.7支持,python3.5不支持# 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))#获取对象方法#使用methodcaller可以获取对象的方法fromoperatorimportmethodcallerclassStudent(object):def__init__(self,name):self.name=namedefgetName(self):returnself.name stu=Student("Jim")func=methodcaller('getName')print(func(stu))#输出Jim放出部分运行的截图,因为print函数使用的比较多,所以打印出来的内容比较多,可以注释掉部分或者对着源代码自己看一下。。。
这里举得例子都是比较简单基础的啦O(∩_∩)O