閉包和裝飾器

2022-07-22 00:42:18 字數 3572 閱讀 2182

一:閉包的理解:

閉包就是內層函式對外層函式變數的引用

例項:

#

閉包def

func():

a = 12

definner():

print("

a>>

", a)

return

inner

func()()

二:裝飾器的理解:

在不改變原函式的情況下,給這個函式增加額外的功能(登陸驗證和列印日誌等會用到)

簡單理解版的裝飾器:

#

需求測試test的執行時間

import

time

deftest():

a=1+34

print("

a值為〉〉

",a)

deffunc(f):

definner():

start_time=time.time()

time.sleep(1)

f()end_time=time.time()

print("

執行時間

",end_time-start_time)

return

inner

test=func(test) #

inner

test() #

inner()

'''流程分析:

第一步:執行 func(test),將test引數傳入給f,這個時候,內層的inner沒有執行,func()函式執行,直接返回inner,inner返回給test,

因為test=func(test),所以,inner直接返回給左邊的test,此時,test就是inner

第二步:執行test(),其實就是執行inner(),即執行內部函式def inner().

第三步:執行到f()時候,由於之前已經將test 引數傳入到func函式裡面的f,所以,現在執行f()--->test(),完成對目標函式的測試效果。

'''

語法糖 @ 版本裝飾器

import

time

deffunc(f):

definner():

start_time=time.time()

time.sleep(1)

f()end_time=time.time()

print("

執行時間

",end_time-start_time)

return

inner

#需求測試test的執行時間

@func

#此時,@func就相當於 test=func(test),@ 就是語法糖

deftest():

a=1+34

print("

a值為〉〉

",a)

@func

deftest02():

c="qeq"

d="gdfa

"print("

c+d>>

",c+d)

#test=func(test) # inner

test() #

inner()

test02() # inner()

三:被裝飾的函式帶引數的裝飾器

主要要理解,*args和**kwargs是什麼

#

*args的理解,在給函式傳參的時候,* 代表聚合,將傳入的引數進行打包

#打包成乙個元組

def func01(*args):

print("

args=

", args)

func01(1, 2, 3) #

args= (1, 2, 3)

**kwargs 則傳入關鍵字引數的時候用的到

被裝飾的函式帶引數:

import

time

deffunc(f):

#** kwargs 則是在傳遞關鍵字引數的時候才用的,且必須要要用到

def inner(*args,**kwargs): #

此時的*args 中的 * 代表聚合,將輸入的實參進行打包成乙個元組

print("

1>>

",args) #

(10, 18)

start_time=time.time()

f(*args,**kwargs) #

此時的*args 中的 * 代表打散,將傳過來的元組進行打散, 比如 10 18

#打成乙個個的引數 10 18,然後逐一分給函式f的引數中

print("

>>

",*args) #

10 18

end_time=time.time()

print("

執行時間

",end_time-start_time)

return

inner

#需求測試test的執行時間

@func

#此時,@func就相當於 test=func(test),@ 就是語法糖

deftest(x,y,a):

time.sleep(1)

print("

a值為〉〉

",x+y,a) # 28 a是關鍵字引數

@func

deftest02(x,y,z):

time.sleep(0.2)

print("

test02的值是:

",x+y+z)

test(10,18,a="

a是關鍵字引數

") #

inner()

#test02(1,2,1)

被裝飾的函式帶返回值:

import

time

deftimer(f):

def inner(*args, **kwargs):

start_time =time.time()

#f(*args,**kwargs)

ret = f(*args, **kwargs) #第二步: ret 得到的時func函式執行的返回結果,

print

(ret)

end_time =time.time()

print("

執行時間〉〉

", end_time -start_time)

return

ret # 第三步: 將被裝飾的函式的返回值返回給inner

return

inner

@timer # func=timer(func)

deffunc(x, y):

time.sleep(0.1)

return x +y

ret1 = func(1, 2) #第一步: func(1,2)函式執行的時候,func的返回值返回給func,

print("

ret=

", ret1) # 3 第四步: 得到inner的返回值 ,其實就是被裝飾的函式的返回值

閉包和裝飾器

叫什麼 閉包有什麼用 跟函式相對可以把外層函式的引數保留下來 怎麼寫 def 外層函式 引數 def 內層函式 pass return 內層函式 心法 兩個函式的巢狀,外層函式返回內層函式的引用,外層函式必須有引數func 裝飾前的test,call fun 三者引數一樣的 def set fun ...

閉包和裝飾器

閉包 兩個函式的巢狀,外部函式返回內部函式的引用,外部函式一定有引數 def 外部函式 引數 def 內部函式 pass return 內部函式 他跟函式之間的區別 1.格式兩個函式巢狀 2.閉包外部函式的引數可以在記憶體中保持 裝飾器是什麼 閉包加 裝飾器的作用 在不改變原先的函式值跟呼叫的方式,...

閉包和裝飾器

在python中建立乙個閉包可以歸結為以下三點 閉包思考 1.閉包似優化了變數,原來需要類物件完成的 作,閉包也可以完成 2.由於閉包引 了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消耗記憶體 裝飾器 開放封閉原則 封閉 已實現的功能 塊 開放 對擴充套件開發 例子 def w1 f...