在了解函数式开发之前,我们先了解一下什么是高阶函数。高阶函数有以下属性:
1.变量可以指向函数
2.函数的参数可以接收变量 3.一个函数可以接收另一个函数作为参数 4.能接收函数作参数的函数就是高阶函数示例为:
def add(x,y,f): return f(x) + f(y)a = absprint add(-5,5,a)#结果为10
我先将a指向了abs函数,然后在自定义的函数add中,我们把a当做了参数,也就是把abs函数当做了参数。
下面给大家介绍几个Python内置的高阶函数:
map()函数:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。示例为:
def f(x): return x*xprint map(f,[1,2,3,4])#输出值为:[1, 4, 9, 16]
可以看得出,map的功能就是让list里面的每一个值都执行一遍f函数,从而变成一个新的list。
reduce()函数:reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。示例为:
def f(x,y): return x+yprint reduce(f,[1,2,3,4,5])#输出值为:15
reduce就是先拿list中的1,2来作为参数调用f函数,得到的结果和3一起作为参数调用f函数,得到的结果再与4一起作为参数来调用f函数,以此类推。所以该段代码就相当于输出一下1+2+3+4+5。
P.S.如果对谷歌的大数据处理有一定了解,或者读过Google的那篇大名鼎鼎的论文“”(这是谷歌家的东西,所以想阅读原文的朋友,记得翻墙)的朋友,应该是很容易理解上述这两个高阶函数的。
filter()函数:filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。示例为:
def is_not_empty(s): return s and len(s.strip())>0print filter(is_not_empty,['test',None,'','str',' ','END'])#输出值为:['test', 'str', 'END']
filter就是拿list里的每个元素去执行is_not_empty函数,如果返回值为true,则保留,如果返回值为false,则将其去除。
sorted()函数:sorted()函数可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。示例为:
print sorted([2,7,3,0,16])#输出值为:[0, 2, 3, 7, 16]def reversed_cmp(x,y): if(x>y): return -1 if(x
从上可以看出,当sorted只传进了一个list,那么将对其进行顺序排序。如果想进行逆序排序,可以自定义函数,然后将其当做参数传进sorted里面。
讲到这里,函数式开发到底是什么呢?我的理解的话,就是这种高度抽象的编程范式。它允许把函数本身作为参数传入另一个函数,还允许返回一个函数!而且函数式编程本身并不包含变量,也就是说,当输入确定时,那么输出也就确定了,这种纯函数编程,我们称之为没有副作用。而普通的函数,由于变量的存在,当输入确定时,可能输出也是有所不同的,这种函数就是有副作用的。