2.2函数式编程
reduce函数与map函数不同,map函数是逐一遍历,而reduce函数是对可迭代对象中的元素进行累计操作计算。在Python3中,reduce函数已经被移出全局命名空间,被置于funtools库中,使用时需要通过from funtools import reduce导入reduce函数。使用reduce函数可以算出n的阶乘,如代码清单2-17所示。
代码清单2-17 使用reduce函数计算n的阶乘
from functools import reduce //导入reduce函数
reduce(lambda x,y:xy,range(1,n+1))
在代码清单2-17中,range(1,n+1)相当于给出了一个列表,其中的元素是1~n这n个整数。lambda x,y:xy构造了一个二元函数,返回两个参数的乘积。reduce函数首先将列表的头两个元素(即n、n+1)作为函数的参数进行运算,得到n(n+1);然后将n(n+1)与n+2作为函数的参数,得到n(n+1)(n+2);再将n(n+1)(n+2)与n+3作为函数的参数……依此递推,直到列表遍历结束,返回最终结果。如果用循环命令,那么需要写成如代码清单2-18所示的形式。
代码清单2-18 使用循环命令计算n的阶乘
a=1
for i in range(1,n+1):
a=a*i
filter函数的功能类似于一个过滤器,可用于筛选出列表中符合条件的元素,如代码清单2-19所示。
代码清单2-19 使用filter函数筛选列表元素
a=filter(lambda x:x>2 and x<6,range(10)) a=list(a) print(a) //输出结果为[3,4,5] 要使用filter函数,首先需要一个返回值为bool型的函数,如代码清单2-19中的lambda x:x>2 and x<6定义一个函数,判断x是否大于2且小于6,然后将这个函数作用到range(10)的每个元素中,若判断结果为True,则取出该元素,最后将满足条件的所有元素组成一个列表并返回。 也可以使用列表解析筛选列表元素,如代码清单2-20所示。 代码清单2-20 使用列表解析筛选列表元素 a=[i for in range(10) if i>2 and i<6]
print(a) //输出的结果也为[3,4,5]
可见使用列表解析并不比filter语句复杂。需要注意的是,使用map函数、reduce函数或filter函数的最终目的都是兼顾简洁和效率,因为map函数、reduce函数或filter函数的循环速度比Python内置的for或while循环要快得多。