您的位置:首页 > 编程语言 > Python开发

Python之——函数式编程

2018-01-02 15:45 232 查看
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/78952445

1、lambda()函数

f = lambda x : x + 2 #定义函数f(x) = x + 2
g = lambda x, y : x + y #定义函数g(x, y) = x + y

2、map()函数

假设有一个列表a = [1,2,3], 要给列表中的每个元素都加2得到一个新列表,利用列表解析,我们可以这样写:

b = [i + 2 for i in a]利用map函数我们可以这样写:
b = map(lambda x : x + 2, a)
b = list(b) #结果是[3, 4, 5]
注意:在3.x需要b=list(b)这一步,在2.x不需要这一步,原因是在3.x中,map函数仅仅是创建一个带运行的命令容器,只有其他函数调用它的时候才返回结果。
也就是说,我们首先定义一个函数,然后利用map命令将函数逐一应用到(map)列表中的每个元素,最后返回一个数组。map()命令也接受多参数的函数,如
map(lambda x,y : x * y, a, b)
表示将a、b两个列表的元素对应相乘,把结果返回给新列表。
有了列表解析,为什么还要有map函数呢?虽然列表解析代码简单,但是本质上还是for循环,而Python的for命令执行效率并不高,map函数实现了相同的功能,并且效率更高,原则上来讲,它的循环命令相当于C语言。

3、reduce()函数

reduce()函数有点像map()函数,但map()函数用于逐一遍历,而reduce()函数用于递归计算。比如:计算n的阶乘:

reduce(lambda x,y: x*y, range(1, n+1))注意:在2.x中,上述命令可以直接运行,在3.x中,reduce函数已经被移出了全局命名空间,它被置于fuctools库中,如需使用,则要通过from fuctools import reduce引入reduce
其中,range(1, n+1)相当于给出了一个列表,元素是1~n这n个整数。lambda x,y : x * y 构造了一个二元函数,返回两个参数的乘积。reduce命令首先将列表的前两个元素作为函数的参数进行运算,然后将运算的结果与第三个数字作为函数的参数,然后再将运算结果与第四个数字作为函数的参数....依次类推,知道列表结束,返回最终的结果。
如果用循环命令,那就要写成:
s = 1
for i in range(1, n+1):
s = s * i

4、filter()函数

filter是一个过滤器,用来筛选出列表中符合条件的元素,比如:
b = filter(lambda x : x > 5 and x < 8, range(10))
b = list(b) #结果是[6, 7]
在3.x需要b = list(b) 这一步,在2.x不需要这一步,理由同map
使用filter()函数首先需要一个返回值为bool型的函数,如上述的lambda x:x > 5 and x < 8 定义了一个函数,判断x是否大于5并且小于8,然后将这个函数作用到range(10)的每一个元素中,如果为True,则“挑出”那个元素,最后将满足条件的所有元素组成一个列表返回。
当然,上述filter语句,可以用列表解析写为:
b = [i for i in range(10) if i > 5 and  i < 8]
它并不比filter语句复杂。但是要注意,我们使用map()、reduce()、或filter(),最终的目的是兼顾简洁和效率,因为map()、reduce()或filter()的循环速度比Python内置的for或while循环要快得多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: