闭包
什么是闭包?
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。
所谓闭包:就是在一个函数内定义了一个函数f,并且这个函数f引用外部变量,在把这个函数f当做返回值返回
闭包demo
#定义一个函数
def test(number):
def test_in(number_in):
print("in test_in 函数, number_in is %d"%number_in)
return number+number_in
return test_in # 其实这里返回的就是闭包的结果
#给test函数赋值,这个20就是给参数number
ret = test(20)
#注意这里的100其实给参数number_in
print(ret(100))
#注意这里的200其实给参数number_in
print(ret(200))
运行结果:
in test_in 函数, number_in is 100
120
in test_in 函数, number_in is 200
220
装饰器(decorator)
什么是装饰器?
装饰器:在不改变函数(当然还有其他的)的代码和调用方式的前提下,为函数增加新的功能!
装饰器常见的应用场景?
1.引入日志
2.函数执行时间统计
3.执行函数前预备处理
4.执行函数后清理功能
5.权限校验等场景
6.缓存
装饰器demo
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('call %s():' % func.__name__)
print('args = {}'.format(*args))
return func(*args, **kwargs)
return wrapper
# 这样就定义了一个打印出方法名及其参数的装饰器。
@log
def test(p):
print(test.__name__ + " param: " + p)
# 调用
test("I'm a param")
程序运行输出:
call test():
args = I'm a param
test param: I'm a param
值得注意的是@functools.wraps(func),这是python提供的装饰器。它能把原函数的元信息拷贝到装饰器里面的 func
函数中。函数的元信息包括docstring、name、参数列表等等。可以尝试去@functools.wraps(func),你会发现test.__name__的输出变成了wrapper。