简单了解python高阶函数map/reduce


Posted in Python onJune 28, 2019

高阶函数map/reduce

Python内建了map()和reduce()函数。

我们先看map。map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:

简单了解python高阶函数map/reduce

现在,我们用Python代码实现:

def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print list(r)

运行结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81]
Process finished with exit code 0

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
你可能会想,不需要map()函数,写一个循环,也可以计算出结果:

L = []
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
L.append(f(n))
print L

的确可以,但是,从上面的循环代码,能一眼看明白“把f(x)作用在list的每一个元素并把结果生成一个新的list”吗?

所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串:

print list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

运行结果:

['1', '2', '3', '4', '5', '6', '7', '8', '9']
Process finished with exit code 0

只需要一行代码。

再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现:

from functools import reduce
def add(x, y):
return x + y
print reduce(add, [1, 3, 5, 7, 9])

运行结果:

25
Process finished with exit code 0

当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。

但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就可以派上用场:

from functools import reduce
def fn(x, y):
return x * 10 + y
print reduce(fn, [1, 3, 5, 7, 9])

运行结果:

13579
Process finished with exit code 0

这个例子本身没多大用处,但是,如果考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),我们就可以写出把str转换为int的函数:

def fn(x, y):
return x * 10 + y
def char2num(s):
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
return digits[s]
print reduce(fn, map(char2num, '13579'))

运行结果:

13579
Process finished with exit code 0

整理成一个str2int的函数就是:

from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return DIGITS[s]
return reduce(fn, map(char2num, s))

还可以用lambda函数进一步简化成:

from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))

也就是说,假设Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python入门篇之正则表达式
Oct 20 Python
Python 3.x 新特性及10大变化
Jun 12 Python
Python利用ansible分发处理任务
Aug 04 Python
python实现在pandas.DataFrame添加一行
Apr 04 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
python列表推导式操作解析
Nov 26 Python
tensorflow estimator 使用hook实现finetune方式
Jan 21 Python
Python参数传递对象的引用原理解析
May 22 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 Python
pycharm 2020 1.1的安装流程
Sep 29 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
安装好Pycharm后如何配置Python解释器简易教程
Jun 28 #Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 #Python
python识别图像并提取文字的实现方法
Jun 28 #Python
python3射线法判断点是否在多边形内
Jun 28 #Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 #Python
python如何实现代码检查
Jun 28 #Python
python射线法判断一个点在图形区域内外
Jun 28 #Python
You might like
第十节--抽象方法和抽象类
2006/11/16 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
extjs fckeditor集成代码
2009/05/10 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
React key值的作用和使用详解
2018/08/23 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
商务英语本科生的自我评价分享
2013/11/15 职场文书
车辆转让协议书
2014/04/15 职场文书
男方婚前保证书
2015/02/28 职场文书
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL