1. operator內置運算子的函式介面
使用迭代器編程時,有時需要為簡單的運算式創建小函式,有些情況下,盡管這確實可以被實作為lambda函式,但某些操作根本不需要新函式,operator模塊定義了一些函式,可以對應標準物件API中內置的算術、比較和其他操作,
1.1 邏輯操作
有些函式可以用來確定一個值的相應布林值,將其取反以創建相反的布林值,以及比較物件以查看它們是否相等,
from operator import * a = -1 b = 5 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))
not_()后面有下劃線,因為not是一個Python關鍵字,在if陳述句中測驗一個運算式或將一個運算式轉換為一個bool時會使用某種邏輯,truth()會應用與之相同的邏輯,is_()實作了is關鍵字使用的檢查,is_not()完成同樣的測驗,不過回傳相反的答案,

1.2 比較運算子
支持所有富比較運算子,
from operator import * a = 1 b = 5.0 print('a =', a) print('b =', b) for func in (lt, le, eq, ne, ge, gt): print('{}(a, b): {}'.format(func.__name__, func(a, b)))
這些函式等價于使用<、<=、==、>=、和>的運算式語法,

1.3 算術運算子
也支持處理數字值的算術運算子,
from operator import * a = -1 b = 5.0 c = 2 d = 6 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)) print('\nArithmetic:') print('add(a, b) :', add(a, b)) print('floordiv(a, b):', floordiv(a, b)) print('floordiv(d, c):', floordiv(d, c)) print('mod(a, b) :', mod(a, b)) print('mul(a, b) :', mul(a, b)) print('pow(c, d) :', pow(c, d)) print('sub(b, a) :', sub(b, a)) print('truediv(a, b) :', truediv(a, b)) print('truediv(d, c) :', truediv(d, c)) print('\nBitwise:') print('and_(c, d) :', and_(c, d)) print('invert(c) :', invert(c)) print('lshift(c, d):', lshift(c, d)) print('or_(c, d) :', or_(c, d)) print('rshift(d, c):', rshift(d, c)) print('xor(c, d) :', xor(c, d))
提供了兩個不同的出發運算子:floordiv()(Python 3.0版本之前實作的整數除法)和truediv()(浮點數除法),

1.4 系列運算子
處理系列的運算子可以分為4組:建立序列、搜索元素、訪問內容以及從序列洗掉元素,
from operator import * a = [1, 2, 3] b = ['a', 'b', 'c'] print('a =', a) print('b =', b) print('\nConstructive:') print(' concat(a, b):', concat(a, b)) print('\nSearching:') print(' contains(a, 1) :', contains(a, 1)) print(' contains(b, "d"):', contains(b, "d")) print(' countOf(a, 1) :', countOf(a, 1)) print(' countOf(b, "d") :', countOf(b, "d")) print(' indexOf(a, 5) :', indexOf(a, 1)) print('\nAccess Items:') print(' getitem(b, 1) :', getitem(b, 1)) print(' getitem(b, slice(1, 3)) :', getitem(b, slice(1, 3))) print(' setitem(b, 1, "d") :', end=' ') setitem(b, 1, "d") print(b) print(' setitem(a, slice(1, 3), [4, 5]):', end=' ') setitem(a, slice(1, 3), [4, 5]) print(a) print('\nDestructive:') print(' delitem(b, 1) :', end=' ') delitem(b, 1) print(b) print(' delitem(a, slice(1, 3)):', end=' ') delitem(a, slice(1, 3)) print(a)
其中一些操作(如setitem()和delitem())會原地修改序列,而且不回傳任何值,

1.5 原地運算子
除了標準運算子,很多物件型別還通過一些特殊運算子(如+=)支持”原地”修改,這些原地修改也有相應的等價函式,
from operator import * a = -1 b = 5.0 c = [1, 2, 3] d = ['a', 'b', 'c'] 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)

1.6 屬性和元素“獲取方法”
operator模塊最特別的特性之一是獲取方法(getter)的概念,獲取方法是運行時構造的一些callable物件,用來獲取物件的屬性或序列的內容,獲取方法在處理迭代器或生成器序列時特別有用,因為獲取方法引入的開銷會大大低于lambda或Python函式的開銷,
from operator import * class MyObj: """example class for attrgetter""" def __init__(self, arg): super().__init__() self.arg = arg def __repr__(self): return 'MyObj({})'.format(self.arg) l = [MyObj(i) for i in range(5)] print('objects :', l) # Extract the 'arg' value from each object g = attrgetter('arg') vals = [g(i) for i in l] print('arg values:', vals) # Sort using arg l.reverse() print('reversed :', l) print('sorted :', sorted(l, key=g))
屬性獲取方法類似于lambda x,n='attrname':getattr(x,n),

元素獲取方法類似于lambda x,y=5:x[y],
from operator import * l = [dict(val=-1 * i) for i in range(4)] print('Dictionaries:') print(' original:', l) g = itemgetter('val') vals = [g(i) for i in l] print(' values:', vals) print(' sorted:', sorted(l, key=g)) print() l = [(i, i * -2) for i in range(4)] print('\nTuples:') print(' original:', l) g = itemgetter(1) vals = [g(i) for i in l] print(' values:', vals) print(' sorted:', sorted(l, key=g))
除了序列,元素獲取方法還適用于映射,

1.7 結合運算子和定制類
operator模塊中的函式完成運算子時會使用標準Python介面,所以它們不僅適用于內置型別,也適用于用戶定義的類,
from operator import * class MyObj: """Example for operator overloading""" def __init__(self, val): super(MyObj, self).__init__() self.val = val def __str__(self): return 'MyObj({})'.format(self.val) def __lt__(self, other): """compare for less-than""" print('Testing {} < {}'.format(self, other)) return self.val < other.val def __add__(self, other): """add values""" print('Adding {} + {}'.format(self, other)) return MyObj(self.val + other.val) a = MyObj(1) b = MyObj(2) print('Comparison:') print(lt(a, b)) print('\nArithmetic:') print(add(a, b))

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187940.html
標籤:Python
