简单了解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 urlopen()函数 示例分享
Jun 12 Python
Python自动生产表情包
Mar 17 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
Python 将Matrix、Dict保存到文件的方法
Oct 30 Python
Python模块、包(Package)概念与用法分析
May 31 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
为什么python比较流行
Jun 19 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
python 提高开发效率的5个小技巧
Oct 19 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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
php设计模式 Composite (组合模式)
2011/06/26 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
动态加载js的几种方法
2006/10/23 Javascript
如何用javascript控制上传文件的大小
2006/10/26 Javascript
利用javascript中的call实现继承
2007/01/22 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
js自定义事件代码说明
2011/01/31 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
Angular的$http与$location
2016/12/26 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
Python 不同对象比较大小示例探讨
2014/08/21 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
opencv实现图像几何变换
2021/03/24 Python
木工主管岗位职责
2013/12/08 职场文书
行政办公员自我评价分享
2013/12/14 职场文书
工作交流会欢迎词
2014/01/12 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
Python 实现Mac 屏幕截图详解
2021/10/05 Python