閉包
由于閉包引用了外部函數(shù)的局部變量赘理,則外部函數(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ù)扇单,它的特殊之處商模,在于它的返回值也是一個函數(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)限級別1,驗證---')
? ? ? ? ? ? elif level_num == 2:
? ? ? ? ? ? ? ? print('---權(quán)限級別2鄙信,驗證---')
? ? ? ? ? ? elif level_num == 10:
? ? ? ? ? ? ? ? print('---權(quán)限級別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、調(diào)用set_func并且將1當(dāng)做實參傳遞
# 2装诡、用上一步調(diào)用的返回值银受,當(dāng)做裝飾器對test1函數(shù)進(jìn)行裝飾