简单了解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中的多重继承实例讲解
Sep 28 Python
python 不以科学计数法输出的方法
Jul 16 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
python基于递归解决背包问题详解
Jul 03 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
Aug 12 Python
python3的url编码和解码,自定义gbk、utf-8的例子
Aug 22 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
Sep 30 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
python爬取youtube视频的示例代码
Mar 03 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面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
Python写的贪吃蛇游戏例子
2014/06/16 Python
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
简单介绍Python中的len()函数的使用
2015/04/07 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
python sys.argv[]用法实例详解
2018/05/25 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
10条PHP编程习惯
2014/05/26 面试题
局域网标准
2016/09/10 面试题
2015年酒店销售部工作总结
2015/07/24 职场文书
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL
基于Python实现nc批量转tif格式
2022/08/14 Python