Python运算符函数化模块

2023-12-24 09:31:32

刷完这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_hintlen估计长度

比较运算符共有4对:

比较运算
lt__lt__<gt__gt__>
le__le__<=ge__ge__>=
eq__eq__==ne__ne__!=
is_isis_notis 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中出现的次数
indexOfb在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

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_37816922/article/details/121135711
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。