閉包
由于閉包引用了外部函數(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('---權限級別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、調(diào)用set_func并且將1當做實參傳遞
# 2愧怜、用上一步調(diào)用的返回值呀页,當做裝飾器對test1函數(shù)進行裝飾
閉包:
定義:在函數(shù)內(nèi)部再定義一個函數(shù),并且這個函數(shù)用到了外邊函數(shù)的變量拥坛,那么將這個函數(shù)以及用到的一些變量稱之為閉包
閉包的本質(zhì)就是函數(shù)嵌套蓬蝶,就是在函數(shù)里面定義函數(shù)
內(nèi)部函數(shù)可以引用外部函數(shù)的參數(shù)和變量
參數(shù)和變量不會被垃圾回收機制給回收
閉包的用途:可以存循環(huán)的索引值、做私有變量計數(shù)器
如果沒有閉包猜惋,我們就需要更多的參數(shù)傳遞丸氛,也減少了代碼的可移植性。
注意點:
由于閉包引用了外部函數(shù)的局部變量著摔,則外部函數(shù)的局部變量沒有及時釋放缓窜,消耗內(nèi)存
裝飾器:
裝飾器就是用于拓展函數(shù)功能的一種函數(shù),它的特殊之處梨撞,在于它的返回值也是一個函數(shù)雹洗,使用裝飾器的好處就是,在不用更改原函數(shù)代碼的前提下卧波,給函數(shù)增加新的功能