TableOfContents

Include(ZPyUGnav)

Python中的函数式编程

Python不是一门纯粹的函数式编程语言,但它在也加入了一些可以有效提高编程效率的函数式编程特性。

高序函数(High Order Functions)支持

函数式编程中,最著名的特色就是High Order。简单的说,就是定制一个算法,按规则作用于指定容器中的每一个元素。最常用的High Order通常是:

Python通过map、filter、reduce三个内置函数实现这三个High Order功能。

使用map

函数 map 至少需要两个参数,第一个是一个函数,第二个是传入函数的参数。例如:

   1 def foo(x):
   2     return x*x
   3 
   4 map(foo, range(10))

以上代码得到10以内的自然数平方表。

map允许接收三个或三个以上的参数,从第二个开始,每个参数都接收一个线性容器(或迭代对象),将每个元素提取出来做为第一个参数(函数)的参数列表。如果各个容器的长度不一样,短缺的部分用None补齐。例如我们可以这样使用:

   1 def foo(x, y):
   2     return x**y
   3 
   4 map(foo, range(10), range(10))

这个计算结果会很大,所以最好不要用太大的数来测试,不过得益于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以内的偶数列:

   1 def foo(x):
   2     return x%2==0
   3 
   4 filter(foo, range(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)]

PageComment2

[:/PageCommentData:PageCommentData]