1、闭包
在外部调用函数内部的函数,且外部函数中return出内部函数
def func(num):
a = 100
def func1():
nonlocal a
a+=1
b = 99
print(a + num, b)
return func1
c = func(10)
c()
闭包可以保存返回闭包的状态(return出来的函数的状态)
def func(num):
a = 99
def func1():
nonlocal a
a+=1
print(a + num)
return func1
r_func1 = func(10)
r_func2 = func(20)
r_func2()
r_func1()
# 运行结果
120
110
2、装饰器
函数作为参数传给另一个函数,在另一个函数中调用该参数函数
# 功能函数
def func1(fun):
def wrapper(*args, **kwargs):
print('装饰函数功能')
res = fun(*args, **kwargs)
return res
return wrapper
@func1
def func():
print('被装饰函数功能')
return 'hello'
r = func()
print(r)
多层装饰器
优先使用最近得装饰器
# 功能函数
def func1(fun):
def wrapper(*args, **kwargs):
res = fun(*args, **kwargs)
print('装饰函数功能1')
return res
return wrapper
# 功能函数
def func2(fun):
def wrapper(*args, **kwargs):
res = fun(*args, **kwargs)
print('装饰函数功能2')
return res
return wrapper
@func2
@func1
def func():
print('被装饰函数')
func()
被装饰函数
装饰函数功能1
装饰函数功能2
装饰器带参数
# 装饰器带参数
def outer(num):
def func1(fun):
def wrapper(*args, **kwargs):
res = fun(*args, **kwargs)
print(f'装饰函数功能1,参数:{num}')
return res
return wrapper
return func1
@outer(num=10)
def func():
print('被装饰函数')
func()