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中实现php的var_dump函数功能
Jan 21 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
django修改models重建数据库的操作
Mar 31 Python
Python实现aes加密解密多种方法解析
May 15 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 Python
python中entry用法讲解
Dec 04 Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 Python
Python re.sub 反向引用的实现
Jul 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
E路文章系统PHP
2006/12/11 PHP
PHP session会话的安全性分析
2011/09/08 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
PHP也能干大事之PHP中的编码解码详解
2015/04/20 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
Python科学画图代码分享
2017/11/29 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
Python最小二乘法矩阵
2019/01/02 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Django自带的用户验证系统实现
2020/12/18 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
节水倡议书
2015/01/19 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
意外事故赔偿协议书
2016/03/22 职场文书