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使用urllib2获取网络资源实例讲解
Dec 02 Python
Python常用知识点汇总
May 08 Python
python中OrderedDict的使用方法详解
May 05 Python
Python队列的定义与使用方法示例
Jun 24 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
单链表反转python实现代码示例
Feb 08 Python
Django 视图层(view)的使用
Nov 09 Python
python实现的分析并统计nginx日志数据功能示例
Dec 21 Python
python selenium操作cookie的实现
Mar 18 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
python爬虫使用scrapy注意事项
Nov 23 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 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文件读写操作之文件写入代码
2011/01/13 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
javascript replace()正则替换实现代码
2010/02/26 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
python查询sqlite数据表的方法
2015/05/08 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
python如何读写csv数据
2018/03/21 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
检察官就职演讲稿
2014/01/13 职场文书
上级检查欢迎词
2014/01/18 职场文书
回门宴父母答谢词
2014/01/26 职场文书
个人授权委托书
2014/04/03 职场文书
城管大队整治方案
2014/05/06 职场文书
安全第一课观后感
2015/06/18 职场文书