Python运算符函数化模块

文章目录

    • 标准运算符替代函数
    • 实用工具
      • itemgetter
      • attrgetter
      • methodcaller

刷完这60个标准库模块,成为Python骨灰级玩家

作为编程语言,如果无法做到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

itemgetter(*ks):其输入为索引号,返回一个函数temptemp的输入为可迭代变量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

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

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

Python运算符函数化模块_第1张图片

你可能感兴趣的:(#,Python标准库,python,开发语言,后端,python标准库,operator)