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自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
python万年历实现代码 含运行结果
May 20 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
对python for 文件指定行读写操作详解
Dec 29 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
Django框架安装方法图文详解
Nov 04 Python
tensorflow estimator 使用hook实现finetune方式
Jan 21 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
python关于变量名的基础知识点
Mar 03 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 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基础知识:类与对象(5) static
2006/12/13 PHP
php echo 输出字符串函数详解
2010/05/13 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
javascript demo 基本技巧
2009/12/18 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
vue3.0 上手体验
2020/09/21 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
不要用强制方法杀掉python线程
2017/02/26 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python try...finally...的实现方法
2020/11/25 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
荷兰电脑专场:Paradigit
2018/05/05 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
党委班子对照检查材料
2014/08/19 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
2019单位介绍信怎么写
2019/06/24 职场文书
python 实现体质指数BMI计算
2021/05/26 Python