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_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

在这里插入图片描述

相关推荐

  1. Python函数模块

    2023-12-24 09:52:02       56 阅读
  2. Python运算符

    2023-12-24 09:52:02       69 阅读
  3. python 运算符

    2023-12-24 09:52:02       45 阅读
  4. python——运算符

    2023-12-24 09:52:02       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-24 09:52:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-24 09:52:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-24 09:52:02       87 阅读
  4. Python语言-面向对象

    2023-12-24 09:52:02       96 阅读

热门阅读

  1. [NOIP2001 提高组] 数的划分

    2023-12-24 09:52:02       54 阅读
  2. k8s部署nginx-ingress服务

    2023-12-24 09:52:02       69 阅读
  3. Python内置数据类型等入门语(句)法

    2023-12-24 09:52:02       60 阅读
  4. LeetCode——1962. 移除石子使总数最小

    2023-12-24 09:52:02       60 阅读
  5. 基于SpringBoot和spark的共享单车存储管理系统

    2023-12-24 09:52:02       69 阅读
  6. 平方矩阵()

    2023-12-24 09:52:02       75 阅读
  7. hdfs.DataStreamer: Exception in createBlockOutputStream XXXXX

    2023-12-24 09:52:02       72 阅读
  8. 超声波测距系统

    2023-12-24 09:52:02       65 阅读
  9. 算法训练营Day23

    2023-12-24 09:52:02       67 阅读