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装饰器decorator用法实例
Nov 10 Python
在Python的循环体中使用else语句的方法
Mar 30 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
python pygame实现方向键控制小球
May 17 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
python实现人机猜拳小游戏
Feb 03 Python
python实现处理mysql结果输出方式
Apr 09 Python
Pandas读取csv时如何设置列名
Jun 02 Python
python自动化发送邮件实例讲解
Jan 04 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/12/06 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
js实现有趣的倒计时效果
2021/01/19 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
Python写的一个简单监控系统
2015/06/19 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
Python实现井字棋小游戏
2020/03/09 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
大学生大二自我鉴定
2013/10/28 职场文书
留学推荐信中文范文
2015/03/26 职场文书
免职通知
2015/04/23 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
goland 恢复已更改文件的操作
2021/04/28 Golang