python 学习汇总54:operator模块(全 推荐- tcy)

本人汇总网上各种资料,经整理调试,补充,以上例程全部通过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)  #3
operator.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)  #True
operator.contains(b,"d")  # False

operator.countOf(b,"c")  #1
operator.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或list
s='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 namedtuple
Size=namedtuple('Size',['x','y','long','width','heigh'])
a=Size(0.1,0.2,30,40,50)

getattr(a,'x')  #0.1
operator.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 = arg
def __repr__(self):
return 'MyObj(%s)' % self.arg
def add(self,x,y):
return x+y

a=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 operator

class MyObj(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):
return self.val < other.val

def __add__(self, other):
return MyObj(self.val + other.val)

a = MyObj(1)
b = MyObj(2)

operator.lt(a, b)  # True
operator.add(a,b)# MyObj(3)

7.类型检查 新版本中已经查不到啦。
 
8.获取对象方法
使用methodcaller可以获取对象的方法:
class Student(object):
def __init__(self, name):
self.name = name

def getName(self):
return self.name
def add(self,x,y):
return x+y

stu = 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函数汇总表 

 

类别OperationSyntaxFunctionremark
比较相等a == beq(a, b) 
比较 a >= bge(a, b) 
比较 a > bgt(a, b) 
比较 a <= ble(a, b) 
比较 a < blt(a, b) 
比较 a != bne(a, b) 
逻辑身份a is bis_(a, b)注1
逻辑身份a is not bis_not(a, b) 
逻辑否定 逻辑not anot_(a) 
逻辑真相测试objtruth(obj)#bool(obj)
其他  all显示所有属性方法
其他  inv(obj) 
其他可调用对象 methodcaller(name [,args ... ] 
算数绝对值 abs(obj)  
算数加成a + badd(a, b)支持就地操作
算数a // bfloordiv(a, b)支持就地操作
算数矩阵乘法a @ bmatmul(a, b)支持就地操作
算数a % bmod(a, b)支持就地操作
算数乘法a * bmul(a, b)支持就地操作
算数否定 算术- aneg(a) 
算数+ apos(a) 
算数a ** bpow(a, b)支持就地操作
算数减法a - bsub(a, b)支持就地操作
算数真正除法 a / btruediv(a, b)2/3是.66支持就地操作
按位和a & band_(a, b)支持就地操作
按位反转~ ainvert(a) 
左移ba << blshift(a, b)支持就地操作
按位或a | bor_(a, b)支持就地操作
右移位a >> brshift(a, b)支持就地操作
按位异或a ^ bxor(a, b)支持就地操作
序列  attrgetter(attr) .attrgetter(* attrs)
序列级联seq1 + seq2concat(seq1, seq2)支持就地操作
序列遏制测试obj in seqcontains(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] = vsetitem(obj, k, v) 
序列切片分配seq[i:j] = valuessetitem(seq, slice(i, j), values) 
注1:通常也适用于所有对象,并支持真值测试,身份测试和布尔操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值