python的函数式编程玩法+年末小感


从小老师教编程语言就告诉分两种:面向过程和面向对象,正如同小学电脑课面对的是win95,仿佛世界上windows就是操作系统的别名,如今还是这样,高校的计算机中心都是windows,所以linux是要自己搞起,函数式编程也是要自己搞起的~不为学分不为奖学金不为工资只是追随着自己的兴趣,这才是最开心的哈~

python有一大优点,就是既可以面向对象也可以面向过程还可以函数式搞起,因此想体验函数式编程的乐趣不用换erlangh或scheme。函数式编程的特点:

1. 变量不可变;

2. 闭包性;


按照函数式编程的特点,一个函数只接受输入并产生输出,不会改变外部变量的值也不会用到外部变量的值。也正因为这样,函数式编程一个函数只做一件事儿,方便模块化,而且代码量要少一些。


1.lambda

lambda是匿名函数,没有函数名,在闭包里和map reduce中很好用。下面是求两数乘积的函数:

>>>func=lambda x,y:x*y
>>>func(3,4)
12

2.map

map函数是对一个序列的每个项依次执行函数,下面是对一个序列每个项都乘以2:

>>> a=map(lambda x:x*2,[1,2,3])
>>> list(a)
[2, 4, 6]

3.reduce

reduce函数是对一个序列的每个项迭代调用函数,下面是求3的阶乘:

>>> functools.reduce(lambda x,y:x*y,range(1,4))
6

好了,这就是python函数式编程常用的几个函数,现在用一个求n的阶乘的例子对比一下函数式编程和面向过程的编程的区别:

>>> def func(n):
...     if n==1:
...             return 1
...     return n*func(n-1)
... 
>>> func(4)
24

>>> g=lambda n:functools.reduce(lambda x,y:x*y,range(1,n+1))
>>> g(4)
24

非常简洁干净~然后再看一下函数式编程的闭包:

>>> def funA():
...     x=0
...     def funB():
...             nonlocal x
...             x+=1
...             print(x)
...     return funB
... 
>>> a=funA()
>>> a()
1
>>> a()
2
>>> a()
3

闭包就是函数中又定义函数,里面的函数可以使用外部作用域内的变量,但不是全局变量,所以一次创建外部函数,则多次调用内部函数时外部作用域内的变量还是有效的;多次运行外部函数,则会重新创建闭包,原来外部变量的值也不会受到影响,如上例可以实现每次调用内部函数是的外部变量+1操作。这里说一下作用域的事儿,原来的python2只有全局作用域和局部作用域,python3新增的nonlocal作用域就是专门针对闭包的,nonlocal声明的变量只能访问外部作用域的变量,不能访问全局作用域的变量,这样就不用全局变量搞来搞去错都不知道哪里出的了。

这篇文章写完了,在2013的最后祝自己和大家新年愉快,为兴趣而活~哈哈


转载请注明:转自 http://blog.csdn.net/littlethunder/article/details/17652449

评论关闭