Python函数式编程:map/reduce
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作为一种抽象程度极高的编程范式,函数式编程的最大特点就是允许函数本身作为一个参数传入另一个函数,并且也可以返回一个函数。本文介绍Python函数式编程的两个极为重要的函数:map和reduce。在介绍这两个函数前,先简单说下什么是高阶函数。
我们求平方根函数的例子来解释什么是高阶函数。
16) > math.sqrt(
4.0
> math.sqrt
<built-in function math.sqrt>
由上可见,math.sqrt(16)是函数调用,而math.sqrt则是函数本身。Python允许将函数本身赋值给一个变量,所以我们可以看到如下效果:
> f = math.sqrt
> f
<built-in function math.sqrt>
于是我们可以得到结论:Python中变量可以指向函数。
变量可以指向函数,函数的参数可以接受变量,那一个函数就可以接受另一个函数作为参数,这样的函数我们称之为高阶函数。
def add(x,y,f):
return f(x)+f(y)
16,9,math.sqrt) > add(
7.0
作为Python函数式编程的代表,你可以将map函数理解为数学上的映射,map函数接受两个参数,一个是函数,另一个则是函数所作用的可迭代对象。map将函数依次作用在可迭代对象的每一个元素上,并将结果作为一个迭代器返回。且看实例:
例如我们有一个函数f(x)=x3 ,有一个list L=[1,2,3,4,5],我们就可以用map函数来将函数作用到这个可迭代对象list上:
def f(x): >
... return x*x*x
...
1, 2, 3, 4, 5] > L = [
> L2 = map(f, L)
> list(L2)
[1, 8, 27, 64, 125]
map函数的好处是可以将运算规则抽象化,对于简单函数我们也许不能体会到方便之处,但对于复杂函数,map的便利性是显而易见的。例如将一个list里面所有数字转化为字符串只需要一行代码:
>>> list(map(str, [1, 2, 3]))
['1', '2', '3']
如果说map函数理解为映射的话,那reduce函数则可以理解为归约或者迭代。reduce函数也只接受两个参数,一个是归约函数,一个是函数所作用的可迭代对象。reduce将一个函数f作用在一个list上的迭代思想如下:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
例如我们想要将一个序列[1,2,3,4,5]变成整数12345,用reduce函数可写为:
from functools import reduce
def fn(x, y):
return x * 10 + y
...
1, 2, 3, 4, 5]) reduce(fn, [
12345
这里仅简单的对map和reduce函数做个简单笔记,内容不多,但关键在于掌握其函数式编程的思想精髓。借助于map/reduce的函数式编程思想,Hadoop的大数据处理工具MapReduce已经将该思想作为一种编程模型,进行大规模数据集的并行运算了。等小编将来学习了Hadoop,再来仔细说说MapReduce吧。
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程 在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。 下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。 下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。 交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~