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实现发送和获取手机短信验证码
Jan 15 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
Python数据操作方法封装类实例
Jun 23 Python
关于Django显示时间你应该知道的一些问题
Dec 25 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 Python
Python定义函数功能与用法实例详解
Apr 08 Python
用python做游戏的细节详解
Jun 25 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
python3获取url文件大小示例代码
Sep 18 Python
python 常见的反爬虫策略
Sep 27 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
ajax 的post方法实例(带循环)
2011/07/04 PHP
php自动获取关键字的方法
2015/01/06 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
JS的反射问题
2010/04/07 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
Python 条件判断的缩写方法
2008/09/06 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
jupyter notebook清除输出方式
2020/04/10 Python
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
女方回门宴答谢词
2014/01/14 职场文书
和睦家庭事迹
2014/05/14 职场文书
作风建设年活动总结
2014/08/27 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
师德承诺书
2015/01/20 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书