posts - 257, comments - 1336, trackbacks - 63, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

也说Functional Programming

Posted on 2005-07-20 12:33 FantasySoft 阅读(1458) 评论(8)  编辑 收藏 所属分类: All About SoftElegant Python
        看了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 。

Feedback

#1楼    回复  引用  查看    

2005-07-20 12:52 by linkcd      
呵呵,基本上用lambda可以玩出许多花样出来。

至于那个op函数,只要满足它接收2个参数,都可以用在那里。

就实用性而已,python要比scheme好多了,所以真要玩FP的话,推荐大家搞python。我用scheme只不过是因为sicp是用scheme来教的,汗...

ps:“Foo(lambda x, y: x+y, 1, 2)”这个有点C#2.0里面匿名方法的味道,呵呵。(那叫什么来着,谓词?)

#2楼    回复  引用  查看    

2005-07-20 13:17 by ShiningRay      
如果要玩Functional Programming,还是用O'Caml或者Haskell 吧

#3楼 [楼主]   回复  引用  查看    

2005-07-20 15:32 by FantasySoft      
To linkcd: Lu Feng兄,您对于op函数的解释,偶还是不太懂哦。 在scheme中,函数是怎样被调用的呢? 我看到了你文章中提到的(+, 1, 2),有点迷惑。

#4楼    回复  引用  查看    

2005-07-20 16:19 by 81      
各们老大,我想学一下python,但想知道学了之后对我的工作有什么帮助吗?现在我是写C#的。

#5楼 [楼主]   回复  引用  查看    

2005-07-20 16:41 by FantasySoft      
To 81: 我现在手头上的工作跟Python一点关系都没有,但是我仍然会去学。因为它真的很高效,很简单,能够帮助自己更加关注需要解决的问题。把语言乃至于计算机看成是工具,只要你能够利用它来解决问题,那么学习就是有价值的。

#6楼    回复  引用  查看    

2005-07-20 19:04 by linkcd      
@ FantasySoft
请看这里
http://linkcd.cnblogs.com/archive/2005/07/20/196841.html

@81:
要说没用,scheme在国内更派不上用场,不过呢,我感觉学习FP是我继领悟OO之后,第二次思想的飞跃哦,呵呵

#7楼    回复  引用  查看    

2005-07-20 20:24 by 81      
谢谢各位指点,这阵子忙完后,学习下python,一直听别人说他。

#8楼    回复  引用    

2006-12-11 14:46 by huangyi[匿名] [未注册用户]
>>> import operator
>>> def Foo(op, x, y):return op(x,y)
...
>>> Foo(operator.add,1,2)
3
>>>

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-07-20 15:34 编辑过


相关链接: