由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
x = 300
def test1():
x=200
def test2():
# global x
nonlocal x
print('---1---x=%d'%x)
x=100
print('---2---x=%s'%x)
return test2
t1 = test1()
t1()
装饰器
装饰器就是用于拓展函数功能的一种函数,它的特殊之处,在于它的返回值也是一个函数,使用装饰器的好处就是,在不用更改原函数代码的前提下,给函数增加新的功能
def outside1(test):
print('执行了装饰器外部函数1')
def inside(*args,**kwargs):
print('welcome1')
return test(*args,**kwargs)
return inside
def outside2(test):
print('执行了装饰器外部函数2')
def inside(*args,**kwargs):
print('welcome2')
return test(*args,**kwargs)
return inside
@outside1
@outside2
def func(*args,**kwargs):
print(kwargs)
# print(*args,**kwargs)
# print('hello world')
#
# a = outside1(func)
# a()
func(a=1,b=2)
带参数的装饰器
def set_level(level_num):
def set_func(func):
def call_func(*args,**kwargs):
if level_num == 1:
print('---权限级别1,验证---')
elif level_num == 2:
print('---权限级别2,验证---')
elif level_num == 10:
print('---权限级别10,验证---')
return func()
return call_func
return set_func
@set_level(10)
def test1():
print('---test1---')
return 'ok'
@set_level(2)
def test2():
print('---test2---')
return 'ok'
test1()
test2()
# 1、调用set_func并且将1当做实参传递
# 2、用上一步调用的返回值,当做装饰器对test1函数进行装饰