什么是闭包
python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用。
闭包的作用就是让一个变量能够常驻内存。
def count():fs = []for i in range(1, 4):def f():return i*ifs.append(f)return fsf1, f2, f3 = count()>>> f1() 9 >>> f2() 9 >>> f3() 9
装饰器(decorator)
装饰器就是为了不修改原函数的定义,并使原函数在运行时动态增加功能的方式,一般来说装饰器是一个返回函数的高阶函数。
def log(func):def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)return wrapper
装饰器使用时要借助@语法:
@log def now():print('2019-3-25')
@语法相当于执行了语句:
now = log(now)
注意:
为了使加过装饰器的函数仍然就有原函数相同的__name__等属性,可以使用以下方法:
import functoolsdef log(func):@functools.wraps(func)def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)return wrapper带参数: import functoolsdef log(text):def decorator(func):@functools.wraps(func)def wrapper(*args, **kw):print('%s %s():' % (text, func.__name__))return func(*args, **kw)return wrapperreturn decorator