
正文
Python入门笔记(21):Python函数(4):关于函数式编程的内建函数
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
一、关于函数式编程的内建函数

apply()逐渐被舍弃,这里不讨论
1、filter()
#filter(func,seq)"""纯Python描述filter函数"""def Myfilter(bool_func,seq): filtered_seq = [] for obj in seq: if bool_func(obj): filtered_seq.append(obj) return filtered_seqprint Myfilter(lambda x:x%3==0, [1,2,3,4,5,6,7,8,9]) #[3, 6, 9]"""Build-In function filter()"""print filter(lambda x:x%3==0, [1,2,3,4,5,6,7,8,9]) #[3, 6, 9]"""非函数下的实现"""print [x for x in [1,2,3,4,5,6,7,8,9] if x%3==0] #[3, 6, 9]#还记得上一节写的,如果能有for..in..if(或列表解析)能处理的最好用这个而放弃lambda
试验:列表解析和lambda性能比较
lambda:
import timestart = time.clock()filter(lambda x:x%3==0, [i for i in range(10000000)])end = time.clock()print end-start #耗时4.9441799282
列表解析:
import timestart = time.clock()[x for x in range(10000000) if x%3==0]end = time.clock()print end-start #耗时2.95589058109
从上可见,最好使用列表解析。
2、map()
"""纯Python模拟map()"""def Mymap(func,seq): mapped_seq = [] for obj in seq: mapped_seq.append(func(obj)) return mapped_seqprint Mymap(lambda x:x*10,[i for i in range(10)]) #[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]"""内建map()函数"""print map(lambda x:x*10,[i for i in range(10)]) #[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]"""非函数式编程"""print [x*10 for x in range(10)] #[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]"""多个序列的map()"""print map(lambda x,y:x+y,[1,2,3],[4,5,6]) #[5, 7, 9]"""None与map()"""print map(None,[1,2,3],[4,5,6]) #[(1, 4), (2, 5), (3, 6)]"""None在map()中使用效果同zip(),将不相干的序列归并在一起"""print zip([1,2,3],[4,5,6]) #[(1, 4), (2, 5), (3, 6)]
3、reduce()
"""纯Python模拟reduce()"""def Myreduce(bin_func,seq,init=None): Iseq = list(seq) if init is None: res = Iseq.pop() else: res = init for obj in Iseq: res = bin_func(res,obj) return res"""reduce()"""
综上,尽量用最简便的方式去实现。







