大大大菜鸟

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

说实话,函数式编程没有接触过的,听过很多次。所以就从python的概念开始接触吧!

  • if语句的一种替换:
1 if <cond1>:
2     func1()
3 elif <cond2>:
4     func2()
5 else:
6     func3()

上面是原始的条件判断语句,针对不同的条件做不同的操作。用函数式来写就是:

1 (<cond1> and func1()) or (<cond2> and func2()) or func3()
  • lambda 表达式的使用

lambda 的概念原来在C#中接触过,以我的理解就是匿名函数。在python的帮助中定义如下:An anonymous inline function consisting of a single expression which is evaluated when the function is called. The syntax to create a lambda function is lambda [arguments]: expression 。lambda主要用来写一些小函数。例如

1 def lowercase(x):
2     return x.lower()
3 

可以写成

1 lowercase = lambda x: x.lower()
1 def adder(x,y):
2     return x + y
3 

可以写成

1 adder=lambda x,y:x+y
  • 常用的map(), reduce()和 filter()

 map() 对指定列表中每个对应的项执行传递的函数,并返回结果列表。相当于: for  item in container : func(item)

1 a="abcdefg"
2 map(lambda x:ord(x),a)

其结果是:[97, 98, 99, 100, 101, 102, 103]

 

 

reduce() 对每个后续项执行传递的函数,返回的是最终结果的内部累加;例如 reduce(lambda n,m:n*m, range(1,10)) 意味着“10 的阶乘”(换句话说,用每一项乘上前一次相乘的乘积)

filter() 使用传递的函数对列表中的每一项“求值”,然后返回经过甄别的,通过了传递函数测试的项的列表。 我们在map的例子基础上执行如下代码:

1 filter(lambda x:ord(x)%2==0 ,a)

结果是:'bdf ‘

  •  函数循环

 标准的for item in container可以用map函数来进行。如果我们要做一连串的函数调用,先调用func1,再 func2,func3,用map来实现的过程如下:

1 tmpFunc=lambda x: x()
2 map(tmpFunc,[func1,func2,func3])

这样可以实现一串函数的连续调用,但是如何来传递参数,还是有待继续研究的。

while循环可以使用if语句的函数式来进行模拟。

 ----------------------------------------------------------------------------------

最后, 函数式编程的优点:绝大部分程序错误 -- 和促使程序员求助于调试来解决的问题 -- 之所以会发生,是因为在程序执行过程期间,变量包含了意外的值。函数程序只不过根本就不为变量分配值,从而避免了这一特殊问题。

posted on 2010-06-12 23:07  月蚀之罪  阅读(323)  评论(0编辑  收藏  举报