python学习笔记(九)函数式进阶:使用map、reduce、filter、sorted

来源:互联网 发布:闪电战2mac版无限子弹 编辑:程序博客网 时间:2024/04/29 01:46

在第三节中简单学习了函数式的概念,这里通过运用几个常用的高阶函数来熟悉函数式编程方法,在文末给出一个综合性例子。

开始

这四个高阶函数具有相似的参数结构,都是以其中一个参数为列表,另一个参数为函数。不同的是它们的功能。

map

map的作用简单来说是将列表中各个元素冠以函数头。即将函数映射作用到每一个元素上.(格式:map(函数,列表))

def mp(a):    print a    return al = [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 curreduce(func,inorder)

filter

filter作用是将满足函数条件的元素全部滤除。因此传入的函数必须为返回true或false的函数。

inorder = filter(lambda(a):a>5,inorder)

sorted

sorted作用是按照函数规则进行排序。函数规则是:返回-1代表二者是逆序关系,返回1代表二者是顺序关系,返回0代表二者等序。
具体实现见例子。

一个例子

import mathimport functoolsclass 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是一种简便的遍历列表的写法。

参考资料:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00141861202544241651579c69d4399a9aa135afef28c44000

0 0
原创粉丝点击