在第三节中简单学习了函数式的概念,这里通过运用几个常用的高阶函数来熟悉函数式编程方法,在文末给出一个综合性例子。
开始
这四个高阶函数具有相似的参数结构,都是以其中一个参数为列表,另一个参数为函数。不同的是它们的功能。
map
map的作用简单来说是将列表中各个元素冠以函数头。即将函数映射作用到每一个元素上.(格式:map(函数,列表))
def mp(a):
print a
return a
l = [1,2,3,4]
map(mp,l)
在这个过程中产生了副作用:打印元素值,在纯函数式编程中是没有这类副作用的。
reduce
如果说map是把每个元素戴上函数的帽子,那么reduce就是将列表的头直接换成函数头。
列表结构类似于一个链表,每一个结点包含当前元素值以及之后元素的指针,且每个结点有一个“列表头”,因此对其进行reduce操作相当于一个递归函数。
传入的函数必须满足其参数性质为:第一个参数为之后的结点计算得出的元素值,第二个参数为当前的结点(可能为空)。
格式:reduce(函数,列表)
reduce(f,[1,2,3,4]) => f(f(f(1,2),3),4)
inorder = [3,2,4,1,6,5,7]
def func(other,cur):
print other,cur
return cur
reduce(func,inorder)
filter
filter作用是将满足函数条件的元素全部滤除。因此传入的函数必须为返回true或false的函数。
inorder = filter(lambda(a):a>5,inorder)
sorted
sorted作用是按照函数规则进行排序。函数规则是:返回-1代表二者是逆序关系,返回1代表二者是顺序关系,返回0代表二者等序。
具体实现见例子。
一个例子
import math
import functools
class item(object):
def __init__(self,x,y):
self.__x = x
self.__y = y
@property
def x(self):
return self.__x
@x.setter
def x(self,value):
self.__x = value
@property
def y(self):
return self.__y
@y.setter
def y(self,value):
self.__y = value
@property
def power(self):
return math.sqrt(self.__x*self.__x+self.__y*self.__y)
def func_sort_with(member):
def item_compare(a,b):
i1 = eval('a.'+member)
i2 = eval('b.'+member)
if i1>i2:
return -1
elif i2>i1:
return 1
return 0
return functools.partial(sorted,cmp = item_compare)
def print_name(it):
print str(it.x)
list_src = [item(i,10-i) for i in range(1,10)]
f1 = func_sort_with('x')
list_1 = f1(list_src)
print 'sort with x:'
map(print_name,list_1)
f2 = func_sort_with('power')
list_2 = f2(list_src)
print 'sort with power'
map(print_name,list_2)
其中f1、f2是用闭包得到的函数,可以根据传入的参数选择类的成员作为其排序依据进行排序;eval()是可以将字符串作为python代码执行的函数;使用map是一种简便的遍历列表的写法。