python的函数式编程玩法+年末小感
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
评论关闭