# 闭包、装饰器
[TOC]
## 1、闭包
一个函数f1接收另一个函数f2作为参数,f1函数就称之为**高阶函数**。
一个求和代码:
```python
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
```
当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
```sh
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
.sum at 0x101c6ed90>
```
调用函数f时,才真正计算求和的结果:
```sh
>>> f()
25
```
在这个例子中,我们在函数`lazy_sum`中又定义了函数`sum`,并且,内部函数`sum`可以引用外部函数`lazy_sum`的参数和局部变量,当`lazy_sum`返回函数`sum`时,相关参数和变量都保存在返回的函数中,这种称为 **闭包(Closure)**。
## 2、装饰器
装饰器语法以 `@` 开头,然后是装饰器函数的名字和可选参数,之后是被装饰器修饰的函数,及可选参数。
@decorator(dec_opt_args)
def func2Bdecorated(func_opt_args):
...
使用装饰器可以运行些预备代码,也可以在运行后执行一些清理工作。
```python
# 定义一个装饰器函数,它是一个高阶函数,返回值是一个函数,形成闭包。
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
"""
用log装饰器修饰now(),相当于log(now),返回 wrapper函数 对象,当使用这个对象时,会执行wrapper函数内的语句.
wrapper()函数的参数定义是`(*args, **kw)`,因此,wrapper()函数可以接受任意参数的调用。
在wrapper()函数内,首先�