Python中的函数式编程
Python不是一门纯粹的函数式编程语言,但它在也加入了一些可以有效提高编程效率的函数式编程特性。
高序函数(High Order Functions)支持
函数式编程中,最著名的特色就是High Order。简单的说,就是定制一个算法,按规则作用于指定容器中的每一个元素。最常用的High Order通常是:
- 映射,也就是将算法施于每个元素,将返回值合并为一个新的容器。
- 过滤,将算法施于每个元素,将返回值为真的元素合并为一个新的容器。
- 合并,将算法(可能携带一个初值)依次施于每个元素,将返回值作为下一步计算的参数之一,与下一个元素再计算,直至最终成为一个总的结果。
Python通过map、filter、reduce三个内置函数实现这三个High Order功能。
使用map
函数 map 至少需要两个参数,第一个是一个函数,第二个是传入函数的参数。例如:
以上代码得到10以内的自然数平方表。
map允许接收三个或三个以上的参数,从第二个开始,每个参数都接收一个线性容器(或迭代对象),将每个元素提取出来做为第一个参数(函数)的参数列表。如果各个容器的长度不一样,短缺的部分用None补齐。例如我们可以这样使用:
这个计算结果会很大,所以最好不要用太大的数来测试,不过得益于Python的长整数,我们仍然可以得到计算结果。如果这样用:map(foo, range(10), range(20)),会收到异常,因为我定义的这个foo不接受None。
如果map的第一个参数为None,那么返回原来的序列,如果传入了多个序列,会将其中每个位置的参数打包成tuple。如:
1 map(None, range(10), range(10))
返回[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
使用 filter
英文单词filter的字面意义有过滤的意思,实际也如此。例如我们可以用下面的方法得到100以内的偶数列:
如果filter的第一个参数是None,返回序列中所有的真值。例如True、非空序列,非零数值等。
使用reduce
filter 可以方便的实现有条件选择,但是如果想要筛法计算素数列,用filter就不够高效了。计算N是否为素数最有效的方法,我们应该只计算已得到的素数列中,小于N的平方根的那部分。而filter并不保存前一步的计算状态(从FP理论上讲,每个filter运算之间是无关的,它们可以并行执行)。需要将上一步计算的结果作为当前计算的一部分时,Python的内置函数reduce就派上用场了。
reduce
::-- MarchLiu [2008-09-12 01:29:18]
反馈
创建 by -- ZoomQuiet [DateTime(2008-09-12T02:40:19Z)]