作为一种抽象程度极高的编程范式,函数式编程的最大特点就是允许函数本身作为一个参数传入另一个函数,并且也可以返回一个函数。本文介绍Python函数式编程的两个极为重要的函数:map和reduce。在介绍这两个函数前,先简单说下什么是高阶函数。
>>>>
高阶函数
我们求平方根函数的例子来解释什么是高阶函数。
>>> math.sqrt(16)
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)
>>> add(16,9,math.sqrt)
7.0
>>>>
map函数
作为Python函数式编程的代表,你可以将map函数理解为数学上的映射,map函数接受两个参数,一个是函数,另一个则是函数所作用的可迭代对象。map将函数依次作用在可迭代对象的每一个元素上,并将结果作为一个迭代器返回。且看实例:
例如我们有一个函数f(x)=x3 ,有一个list L=[1,2,3,4,5],我们就可以用map函数来将函数作用到这个可迭代对象list上:
>>> def f(x):
... return x*x*x
...
>>> L = [1, 2, 3, 4, 5]
>>> L2 = map(f, L)
>>> list(L2)
[1, 8, 27, 64, 125]
map函数的好处是可以将运算规则抽象化,对于简单函数我们也许不能体会到方便之处,但对于复杂函数,map的便利性是显而易见的。例如将一个list里面所有数字转化为字符串只需要一行代码:
>>> list(map(str, [1, 2, 3]))
['1', '2', '3']
>>>>
reduce函数
如果说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
...
>>> reduce(fn, [1, 2, 3, 4, 5])
12345
这里仅简单的对map和reduce函数做个简单笔记,内容不多,但关键在于掌握其函数式编程的思想精髓。借助于map/reduce的函数式编程思想,Hadoop的大数据处理工具MapReduce已经将该思想作为一种编程模型,进行大规模数据集的并行运算了。等小编将来学习了Hadoop,再来仔细说说MapReduce吧。
louwill学习参考资料:
廖雪峰老师Python官方教程
http://www.liaoxuefeng.com/
推文为该教程学习笔记
MapReduce: Simplified Data Processing on Large Clusters