作为编程语言,如果无法做到Lisp的括号风格,那么必然羞于承认自己是函数式。python的lambda表达式以及各种生成式,使得Python几乎可以像Lisp一样通过一行代码解决所有问题,而operator则是走向这种极端函数式风格的最后一步——运算符的函数化。
opreator中封装了运算符对应的函数,下面默认
from operator imoprt *
单目运算 | 备注 | ||
---|---|---|---|
pos | __pos__ | + | 取正 |
neg | __neg__ | - | 取负 |
not_ | __not__ | not | 逻辑取反 |
inv | __inv__ | ~ | 按位取反 |
invert | __invert | ~ | 按位取反 |
index | __index__ | 返回整数 | |
abs | __abs__ | 绝对值 | |
length_hint | len | 估计长度 |
比较运算符共有4对:
比较运算 | |||||
---|---|---|---|---|---|
lt | __lt__ | < | gt | __gt__ | > |
le | __le__ | <= | ge | __ge__ | >= |
eq | __eq__ | == | ne | __ne__ | != |
is_ | is | is_not | is not |
常用的双目运算在python中都有原地运算的用法,例如b=a+b
可以写为b+=a
,所以下表列出二者的对应关系。
双目运算 | 原地运算 | ||||
---|---|---|---|---|---|
add | __add__ | + | iadd | __iadd__ | += |
sub | __sub__ | - | isub | __isub__ | -= |
mul | __mul__ | * | imul | __imul__ | *= |
pow | __pow__ | ** | ipow | __ipow__ | **= |
truediv | __truediv__ | / | itruediv | __itruediv__ | /= |
floordiv | __floordiv__ | // | ifloordiv | __ifloordiv__ | //= |
mod | __mod__ | % | imod | __imod__ | %= |
lshift | __lshift__ | << | ilshift | __ilshift__ | <<= |
rshift | __rshift__ | >> | irshift | __irshift__ | >>= |
matmul | __matmul__ | @ | imatmul | __imatmul__ | @= |
and_ | __and__ | & | iand | __iand__ | &= |
or_ | __or__ | | | ior | __ior__ | |= |
xor | __xor__ | ^ | ixor | __ixor__ | ^= |
其中绝大部分运算是初学者应该掌握的,只有@可能比较陌生,表示矩阵乘法。
除了这些,operator还实现了可迭代的数据类型的操作,下面的函数用于可迭代变量,例如contains(a,b)中,a是可迭代变量,表示
b in a
contains(a,b) | __contains__ | b in a |
delitem(a,k) | __delitem__ | del a[k] |
getitem(a,k) | __getitem__ | a[k] |
setitem(a,k,b) | __setitem__ | a[k]=b |
countOf(a,b) | b在a中出现的次数 | |
indexOf | b在a中受此出现的索引 | |
iconcat(a1,a2) | __iconcat__ | a1 += a2 |
operator中还封装了几个比较实用的函数,下面各案例中,用temp指代某匿名函数。
itemgetter(*ks)
:其输入为索引号,返回一个函数temp
。temp
的输入为可迭代变量lst
,输出为lst
中索引号为*ks
的值。
例如
>>> from operator import *
>>> getSecond = itemgetter(1)
>>> getSecond([1,2,3,4,5])
2
>>> getSecond('abcde')
'b'
>>> itemgetter(1,2)('ABCDEFG')
('B', 'C')
attrgetter(*ks)
:输入为调用对象的属性,输出为一个函数temp。temp的输入为某个对象obj,输出为lst中名为*ks
的值。
例如
>>> class test:
... x = 1
... y = 2
... z = 3
...
>>> t = test()
>>> getXY = attrgetter('x','y')
>>> getXY(t) #返回t.x, t.y
(1, 2)
methodcaller(**ks)
:与attrgetter相似,只不过由该函数创建的匿名函数,其返回值为方法。
>>> class test:
... x = 1
... y = 2
... z = 3
... getX = lambda self: self.x
... getY = lambda self: self.y
... getZ = lambda self: self.z
...
>>> t = test()
>>> GetX = methodcaller('getX')
>>> GetX(t) #相当于调用t.getX()
1