Python运算符函数化模块

刷完这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

在这里插入图片描述

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值