Python 中Operator模块的使用


Posted in Python onJanuary 30, 2021

Python 中的 Operator 模块可以让它支持函数式编程。

1 计算函数

假设我们需要一个计算阶乘的函数,一般做法是使用递归。如果使用函数式编程,可以有两种方式,一种 lambda,另一种使用 Operator 模块中的算术函数。我们做个比较。

首先使用 lambda 方式来实现:

from functools import reduce
def fact(n):
  return reduce(lambda a, b: a * b, range(1, n + 1))

这里用到了 reduce 方法,reduce() 函数语法:reduce(function, iterable[, initializer])。其中的 function 函数有两个参数。reduce() 函数会先对集合中的第 1、2 个元素进行 function 函数处理,得到的结果再与第三个元素进行 function 函数处理,最后得到一个结果1。

reduce() 函数中的 function 使用 lambda 表达式。第二个入参 iterable 使用 range() 方法来生成。

接着使用 Operator 模块中的 mul 函数来实现阶乘:

from operator import mul
def factWithMul(n):
  return reduce(mul, range(1, n + 1))

相对来说,使用 Operator 模块中的计算函数,代码更加简洁。

从源码上分析,mul 函数就是计算两个入参的乘积:

def mul(a, b):
  "Same as a * b."
  return a * b

Operator 模块内部还定义了很多类似的计算函数,比如:

Python 中Operator模块的使用

2 过滤函数

operator 模块中还有一类函数能够起到条件过滤的作用。

首先介绍 itemgetter 函数。假设定义了一个 f 函数,f = itemgetter(2),那么如果调用 f(r),实际会返回 r[2]。也就是说,传入的入参 r,最终返回的只是 r 的索引值为 2 (从 1 开始计算)那一部分。

itemgetter 函数应用场景是:根据元组的某个字段对元组列表进行排序。比如我们有一段 JSON 格式的城市数据,需要对其简称进行排序:

from operator import itemgetter

metro_areas = [('Tokyo', 'JP', 36.933, (35.689722, 139.691667)), ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
        ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
        ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
        ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
        ]
for city in sorted(metro_areas, key=itemgetter(1)):
  logging.info('city -> %s', city)

运行结果:

INFO - city -> ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833))
INFO - city -> ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889))
INFO - city -> ('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
INFO - city -> ('Mexico City', 'MX', 20.142, (19.433333, -99.133333))
INFO - city -> ('New York-Newark', 'US', 20.104, (40.808611, -74.020386))

城市数据数组中的每一个元素,拆分来看,就是元组形式。 itemgetter 函数取出元组的第二个值作为 sorted 函数的排序依据。

如果传入 itemgetter 的入参不止一个,那么它就是一个过滤函数,只把需要的列过滤出来。

比如我们只需要城市数组中的城市简称与所在坐标,就可以这么做:

cc_name = itemgetter(1, 3)
for city in metro_areas:
logging.info('city -> %s', cc_name(city))

运行结果:

INFO - city -> ('JP', (35.689722, 139.691667))
INFO - city -> ('IN', (28.613889, 77.208889))
INFO - city -> ('MX', (19.433333, -99.133333))
INFO - city -> ('US', (40.808611, -74.020386))
INFO - city -> ('BR', (-23.547778, -46.635833))

以上就是Python 中Operator模块的使用的详细内容,更多关于Python 中Operator模块的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python素数检测实例分析
Jun 15 Python
谈谈Python进行验证码识别的一些想法
Jan 25 Python
python安装教程 Pycharm安装详细教程
May 02 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
Python实现二维曲线拟合的方法
Dec 29 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
Python @property装饰器原理解析
Jan 22 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
python多线程爬取西刺代理的示例代码
Jan 30 #Python
Python如何实现Paramiko的二次封装
Jan 30 #Python
python实现按日期归档文件
Jan 30 #Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 #Python
如何用Django处理gzip数据流
Jan 29 #Python
Spy++的使用方法及下载教程
Jan 29 #Python
Python实现随机爬山算法
Jan 29 #Python
You might like
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
Python Requests安装与简单运用
2016/04/07 Python
Python做文本按行去重的实现方法
2016/10/19 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
python实现八大排序算法(2)
2017/09/14 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
python清除函数占用的内存方法
2018/06/25 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
wxPython实现分隔窗口
2019/11/19 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
后勤主管工作职责
2013/12/07 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
夏洛特的网观后感
2015/06/15 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android