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 08 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
解决pyecharts在jupyter notebook中使用报错问题
Apr 23 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
python ftplib模块使用代码实例
Dec 31 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
Django与pyecharts结合的实例代码
May 13 Python
Python 如何展开嵌套的序列
Aug 01 Python
如何在python中处理配置文件代码实例
Sep 27 Python
利用python实现汉诺塔游戏
Mar 01 Python
python反编译教程之2048小游戏实例
Mar 03 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读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
php时区转换转换函数
2014/01/07 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
JS实现滑动插件
2020/01/15 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
团员的自我评价
2013/12/01 职场文书
培训自我鉴定
2014/01/31 职场文书
会计专业求职信
2014/08/10 职场文书
微信搭讪开场白
2015/05/28 职场文书
2016年清明节寄语
2015/12/04 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
MySQL一些常用高级SQL语句
2021/07/03 MySQL
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
python语言中pandas字符串分割str.split()函数
2022/08/05 Python