简单了解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使用chardet判断字符编码
May 09 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
python2.7和NLTK安装详细教程
Sep 19 Python
详解Python做一个名片管理系统
Mar 14 Python
Python中format()格式输出全解
Apr 12 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
python实现邮件循环自动发件功能
Sep 11 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 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
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
js 控制图片大小核心讲解
2013/10/09 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
python 运算符 供重载参考
2009/06/11 Python
Python中的rfind()方法使用详解
2015/05/19 Python
python中的编码知识整理汇总
2016/01/26 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
中学教师岗位职责
2013/11/26 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
争先创优演讲稿
2014/09/15 职场文书
党员转正党支部意见
2015/06/02 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
节水宣传标语口号
2015/12/26 职场文书
九年级数学教学反思
2016/02/17 职场文书
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
python实现Nao机器人的单目测距
2021/09/04 Python