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的Flask框架中实现单元测试的教程
Apr 20 Python
python语言中with as的用法使用详解
Feb 23 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
详解Python 函数如何重载?
Apr 23 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
Python栈的实现方法示例【列表、单链表】
Feb 22 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 Python
Python自动化之批量处理工作簿和工作表
Jun 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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
Python语言的面相对象编程方式初步学习
2016/03/12 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
pandas的排序和排名的具体使用
2019/07/31 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
求职简历中的自我评价分享
2013/12/08 职场文书
学术会议欢迎词
2014/01/09 职场文书
英文请假条
2014/04/11 职场文书
高中教师考核方案
2014/05/18 职场文书
公司授权委托书样本
2014/09/15 职场文书
会计工作总结范文2014
2014/12/23 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python