简单了解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处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
Python实现单词翻译功能
Jun 06 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
Python如何执行系统命令
Sep 23 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
PHP开发注意事项总结
2015/02/04 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
浅谈PHP的反射机制
2016/12/15 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
python+opencv实现动态物体识别
2018/01/09 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
六道php面试题附答案
2014/06/05 面试题
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
金属材料工程个人求职的自我评价
2013/12/04 职场文书
装修设计师求职信
2014/02/26 职场文书
老师对学生的寄语
2014/04/09 职场文书
工商局调档介绍信
2015/10/22 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
Opencv中cv2.floodFill算法的使用
2021/06/18 Python
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
python游戏开发之pygame实现接球小游戏
2022/04/22 Python