代码改变世界

也说Functional Programming

2005-07-20 12:33 FantasySoft 阅读(...) 评论(...) 编辑 收藏
        看了Lu Feng兄写的4个程序员的一天以及很多朋友对此post的回复,不禁让我兴奋不已。因为我想起了Python,毕竟在Functional Programming方面又怎么能少了Python这条可爱的小蟒蛇呢?
        偶没有Lu Feng兄那么强的表达能力,能够将语言的特性如讲故事一般娓娓道来,只能随手写两行代码来展示一下Python在Functional Programming方面的功底了。:)
        首先,在Python中,Everything is object,所以function本身也是object,是当作一等公民(First class citizen)来对待的,也就是说一个函数本身可以作为另外一个函数的参数,也可以接受另外一个函数作为自己的参数是 不是有点不分你我,人人平等的感觉呢?呵呵~~ 从Python有很多内建函数都可以看出其对于Functional Programming的支持。我们先来看一个例子:内建的filter函数。filter函数的作用是将一个序列(如List,String等)中符合要求的元素挑出来,那么这个要求通过什么来体现呢?就是通过一个返回布尔型的函数了,也就是说filter函数的其中一个参数是函数。filter函数的signature是filter (function, sequence),请看以下代码:

>>> name = 'perhaps'
>>> def f(x): return x > 'a' and x < 'p'

>>> filter(f, name)
'eh'


除了filter之外,还有map和reduce,有兴趣的朋友,可以参阅Python Tutorial。

        接着,我们再来看看Lu Feng兄在post中提到的那个例子。Scheme的代码真的很简单,简单得让我这个Python的热衷者都汗颜了。不过,我倒是有个疑问。根据文中用Scheme写的Foo函数,我在Python中,一样可以模仿着定义出来的:
   
>>> def Foo(op, x, y): op(x, y)

是 不是也如Scheme一样简单呢?但是,问题来了,Foo函数在调用的时候,op函数是不是也应该已经一并定义出来了呢?也许是Scheme对于运算符有 很好的支持吧,所以在Scheme中,可以使用(+, 1, 2)这样的方式。如果op变得复杂,是不是仍然会是这样的简单呢?对Scheme了解,我就局限于它是黑客的第一门语言,因此不敢再作推断了。好,根据以 上Foo函数的定义,我们来看看在Python中,如何调用这个Foo函数吧:

>>> Foo(lambda x, y: x+y, 12)
>>> 3


>>> def f(x, y): return x*y

>>> Foo(f, 36
)
>>> 18

在以上的代码中,lambda会比较特别,它是用于定义匿名函数的。要在Python中用好Functional Programming,可少不了它哦。
         就说到这里了,对于Functional Programming有兴趣的朋友,可以看看这一篇文章:Functional Programming with Python 。