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压缩和解压缩zip文件的教程
May 06 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 Python
自学python用什么系统好
Jun 23 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
深入理解python协程
Jun 15 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
如何对PHP程序中的常见漏洞进行攻击
2006/10/09 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
jQuery位置选择器用法实例分析
2019/06/28 jQuery
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
Python实现全排列的打印
2018/08/18 Python
python中bytes和str类型的区别
2019/10/21 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Django REST 异常处理详解
2020/07/15 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
艺术专业大学生自我评价
2013/09/22 职场文书
大家检讨书5000字
2014/02/03 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
工作失职检讨书500字
2014/10/17 职场文书
基于docker安装zabbix的详细教程
2022/06/05 Servers