简单了解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 list使用示例 list中找连续的数字
Jan 27 Python
python实现跨文件全局变量的方法
Jul 07 Python
Python实现Linux下守护进程的编写方法
Aug 22 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
python如何重载模块实例解析
Jan 25 Python
Python中修改字符串的四种方法
Nov 02 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
Jun 14 Python
django框架使用方法详解
Jul 18 Python
python定位xpath 节点位置的方法
Aug 27 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
Python networkx包的实现
Feb 14 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模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
javascript下function声明一些小结
2007/12/28 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
基于IView中on-change属性的使用详解
2018/03/15 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
参观监狱心得体会
2014/01/02 职场文书
法律进机关实施方案
2014/03/12 职场文书
社会实践活动总结报告
2014/04/29 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL