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 sys.path详细介绍
Oct 17 Python
用Python编写一个国际象棋AI程序
Nov 28 Python
python中的闭包用法实例详解
May 05 Python
200行自定义python异步非阻塞Web框架
Mar 15 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
python实现批量转换图片为黑白
Jun 16 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
Python中的流程控制详解
Feb 18 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 Python
Python基本数据类型之字符串str
Jul 21 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php 过滤器实现代码
2010/08/09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
javascript 跳转代码集合
2009/12/03 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python实现字符串和字典的转换
2018/09/29 Python
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
2014两会学习心得:时代的发展
2014/03/17 职场文书
2015年酒店工作总结
2015/04/28 职场文书
教师旷工检讨书
2015/08/15 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
《三国志》赏析
2019/08/27 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
Python3的进程和线程你了解吗
2022/03/16 Python