页面

2009年3月23日

体验Python函数式编程


在函数式编程里面, 我们可以定义匿名函数,也可以把函数赋值给一个变量或作为参数传递给另外一个函数,Python语言很早就支持函数式编程,我们可以用lambda关键字定义一个匿名函数,然后赋值给一个变量,如下所示:
>>> f=lambda(n):n**2
>>> f(6)
36

>>> f=lambda(n):lambda(m):n*m
>>> g=f(5) #相当与g=lambda(m):5*m
>>> g(9) #相当于5*9
45

lambda定义的匿名函数可以引用外围函数的变量,上面的代码中,第二个lambda表达式定义的匿名函数引用了第一个匿名函数的参数n,因为第一个匿名函数是第二个匿名函数的外围函数。

除了lambda表达式之外,python还支持将函数作为参数传递给另外一个函数,有点类似于C语言中的函数指针,python语言内建的函数filter,map,reduce就可以接受函数参数。filter(function, sequence)会遍历sequence中的每一个item,并以该item为参数调用function,如果function返回ture,就将该item加到结果sequence中,这就达到过滤sequence的效果,作为参数的function就是过滤的条件,例子如下:
>>> a=range(1,10)
>>> filter(lambda(n):n%2==0,a)
[2, 4, 6, 8]
这里用lambda定义的匿名函数来定义过滤条件,在list a中返回是偶数的items

map(function, sequence)也是遍历sequence中的每一个item,并以该item为参数调用function,然后将执行结果添加到最终的结果sequence中,例子如下:
>>> b=range(1,10)
>>> map(lambda(n):n**2,b)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce(function, sequence)先把sequence中的头两个item作为参数传给function,将function的运行结果跟第三个item作为参数再次传给function,直至遍历完sequence,最后把单个值返回,例子如下:
>>> def add(x,y):
return x+y

>>> reduce(add,range(1,10))
45

没有评论: