简单了解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创建关联数组(字典)的方法
May 04 Python
python实现连接mongodb的方法
May 08 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
Python3模拟curl发送post请求操作示例
May 03 Python
python安装numpy和pandas的方法步骤
May 27 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
详解Python中import机制
Sep 11 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 Python
python引入其他文件夹下的py文件具体方法
May 23 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 用sock技术发送邮件的函数
2007/07/21 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
php mysql 封装类实例代码
2016/09/18 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
axios基本入门用法教程
2017/03/25 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
Python实时获取cmd的输出
2015/12/13 Python
Python 含参构造函数实例详解
2017/05/25 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
法学毕业生自我鉴定
2013/11/08 职场文书
员工工作表扬信范文
2014/01/13 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
干部作风建设工作总结
2014/10/29 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript