函数式编程

函数式编程
偏函数
偏函数的概念是将函数式编程的概念和默认参数以及可变参数结合在一起
一个带有多个参数的函数,如果其中某些参数是固定的,那么就可以通过偏函数为这些参数赋上默认值
>>> from operator import add
>>> from functools import partial
>>> add10 =partial(add,10)
>>> print add10(25)
35


递归函数
如果函数中包含了对其自身的调用,该函数就是递归的
在操作系统中,查看某一目录内的所有文件、修改权限等都是递归应用
>>> def func(num):
...     if num==1:
...          return 1
...     else:
...          return num*func(num-1)
...
>>> print func(5)
120
>>> print func(10)
3628800

内部函数
闭包
闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来
闭包的词法变量不属于全局名字空间域或者局部的——而属于其他的名字空间,带着“流浪”的作用域
闭包对于安装计算,隐藏状态,以及在函数对象和作用域中随意的切换是很有用的
闭包也是函数,但是他们能携带一些额外的作用域
闭包实例
在电子商务平台下,每件商品的都有一个计数器说明该商品售出数量,这个计数器就可以通过闭包实现
>>> def counter(start_at=0):
...  count=[start_at]
...  def incr():
...     count[0]+=1
...     return count[0]
...  return incr
...
>>> a=counter()
>>> print a()
1
>>> b=counter(10)
>>> print b()
11
>>> print a()
2
>>> print a()
3

装饰器
装饰器是在函数调用之上的修饰
这些修饰仅当声明一个函数或者方法的时候,才会应用的额外调用
使用修饰器的情形有:
——引入日志
——增加计时逻辑来检查性能
——给函数加入事物的能力

生成器
定义生成器
从句法上讲,生成器是一个带yield语句的函数
一个函数或一个子程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果
yield语句返回一个值给调用者并暂停执行
当生成器的next()方法被调用的时候,它会准确地从离开的地方继续

与迭代器相似,生成器以另外的方式来运作
当达到一个真正的返回或者函数结束没有更多的值返回,StopInteration异常会被抛出

>>> def simpGen():
...     yield '1'
...     yield '2->punch'
...
>>> mygen = simpGen()
>>> mygen.next()
'1'
>>> mygen.next()
'2->punch'
>>> mygen.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
生成器特性
用户可以通过send()将值送给生成器,还可以在生成器中抛出异常,以及要求生成器退出

>>> def counter(num):
...   for i in range(num):
...      val=yield i
...
>>> c = counter(10)
>>> c.next()
0
>>> c.close()
>>> c.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>


posted @ 2018-02-08 18:26  Guan_zi  阅读(112)  评论(0编辑  收藏  举报