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写的贪吃蛇游戏例子
Jun 16 Python
Python使用chardet判断字符编码
May 09 Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 Python
Python内置模块turtle绘图详解
Dec 09 Python
Python中对数组集进行按行打乱shuffle的方法
Nov 08 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
Python3内置模块random随机方法小结
Jul 13 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
django 装饰器 检测登录状态操作
Jul 02 Python
python如何设置静态变量
Sep 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
php判断当前用户已在别处登录的方法
2015/01/06 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
js 异步处理进度条
2010/04/01 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
2020/02/06 Javascript
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
python自动zip压缩目录的方法
2015/06/28 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
简单解决Python文件中文编码问题
2015/11/22 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
北京奥运会口号
2014/06/21 职场文书
2015年酒店工作总结
2015/04/28 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
centos7安装mysql5.7经验记录
2022/05/02 Servers