由于閉包引用了外部函數(shù)的局部變量脚乡,則外部函數(shù)的局部變量沒(méi)有及時(shí)釋放蜒滩,消耗內(nèi)存
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()
裝飾器
裝飾器就是用于拓展函數(shù)功能的一種函數(shù),它的特殊之處奶稠,在于它的返回值也是一個(gè)函數(shù)俯艰,使用裝飾器的好處就是,在不用更改原函數(shù)代碼的前提下锌订,給函數(shù)增加新的功能
def outside1(test):
? ? print('執(zhí)行了裝飾器外部函數(shù)1')
? ? def inside(*args,**kwargs):
? ? ? ? print('welcome1')
? ? ? ? return test(*args,**kwargs)
? ? return inside
def outside2(test):
? ? print('執(zhí)行了裝飾器外部函數(shù)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)
帶參數(shù)的裝飾器
def set_level(level_num):
? ? def set_func(func):
? ? ? ? def call_func(*args,**kwargs):
? ? ? ? ? ? if level_num == 1:
? ? ? ? ? ? ? ? print('---權(quán)限級(jí)別1竹握,驗(yàn)證---')
? ? ? ? ? ? elif level_num == 2:
? ? ? ? ? ? ? ? print('---權(quán)限級(jí)別2,驗(yàn)證---')
? ? ? ? ? ? elif level_num == 10:
? ? ? ? ? ? ? ? print('---權(quán)限級(jí)別10辆飘,驗(yàn)證---')
? ? ? ? ? ? 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啦辐、調(diào)用set_func并且將1當(dāng)做實(shí)參傳遞
# 2、用上一步調(diào)用的返回值蜈项,當(dāng)做裝飾器對(duì)test1函數(shù)進(jìn)行裝飾