Python中的高级函数map/reduce使用实例


Posted in Python onApril 13, 2015

Python内建了map()和reduce()函数。

如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。

我们先看map。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:

Python中的高级函数map/reduce使用实例

现在,我们用Python代码实现:

>>> def f(x):

...     return x * x

...

>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的第一个参数是f,即函数对象本身。

你可能会想,不需要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所有数字转为字符串:

>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])

['1', '2', '3', '4', '5', '6', '7', '8', '9']

只需要一行代码。

再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现:
>>> def add(x, y):

...     return x + y

...

>>> reduce(add, [1, 3, 5, 7, 9])

25

当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。

但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就可以派上用场:

>>> def fn(x, y):

...     return x * 10 + y

...

>>> reduce(fn, [1, 3, 5, 7, 9])

13579

这个例子本身没多大用处,但是,如果考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),我们就可以写出把str转换为int的函数:
>>> def fn(x, y):

...     return x * 10 + y

...

>>> def char2num(s):

...     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

...

>>> reduce(fn, map(char2num, '13579'))

13579

整理成一个str2int的函数就是:
def str2int(s):

    def fn(x, y):

        return x * 10 + y

    def char2num(s):

        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

    return reduce(fn, map(char2num, s))

还可以用lambda函数进一步简化成:
def char2num(s):

    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def str2int(s):

    return reduce(lambda x,y: x*10+y, map(char2num, s))

也就是说,假设Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码!
Python 相关文章推荐
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
python requests.get带header
May 05 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
python 发送get请求接口详解
Nov 17 Python
Python非单向递归函数如何返回全部结果
Dec 18 Python
Python遍历目录的4种方法实例介绍
Apr 13 #Python
用Python生成器实现微线程编程的教程
Apr 13 #Python
Python字符串处理函数简明总结
Apr 13 #Python
Python日志模块logging简介
Apr 13 #Python
Python命令行参数解析模块optparse使用实例
Apr 13 #Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 #Python
Python随机生成数模块random使用实例
Apr 13 #Python
You might like
php实现curl模拟ftp上传的方法
2015/07/29 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
详解Nodejs内存治理
2018/05/13 NodeJs
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
python使用cookielib库示例分享
2014/03/03 Python
python引用DLL文件的方法
2015/05/11 Python
python中引用与复制用法实例分析
2015/06/04 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
python实现归并排序算法
2018/11/22 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
工商学院毕业生自荐信
2013/11/12 职场文书
大学生思想汇报范文
2013/12/31 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS