"""
请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,
外部的我们叫他外函数,内部的我们叫他内函数。
闭包:
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,
并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
"""
"""
# 闭包函数的实例
# outer是外部函数 a和b都是外函数的临时变量
def outer(a):
b = 10
# inner是内函数
def inner():
# 在内函数中 用到了外函数的临时变量
print(a + b)
# 外函数的返回值是内函数的引用
return inner
if __name__ == '__main__':
# 在这里我们调用外函数传入参数5
# 此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
# 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
demo = outer(5)
# 我们调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
# demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
demo() # 15
demo2 = outer(7)
demo2() # 17
"""
"""
闭包有啥用啊?装饰器!!!
代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
"""
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
def log1(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
if __name__ == '__main__':
@log # log(now)
def now(name, age):
print('2013-12-25')
print(name, age)
now(1, 3)
@log1("execute")
def now1():
print('2013-12-25')
now1()