1. 程式人生 > >python 學習彙總54:operator模組(全 推薦- tcy)

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函式彙總表 

 

類別 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: 通常也適用於所有物件,並支援真值測試,身份測試和布林操作