Day 11 閉包函式 裝飾器

2022-08-21 14:15:14 字數 3595 閱讀 5734

def

outer(x,y):

defmy_max():

if x > y: #

引用了outer 的引數,相當與引用了 outer的變數 為閉包函式

return

x

return

y

return

my_max

res = outer(80,90)

print(res())

裝飾器必須要遵守兩個原則 1:不改變被裝飾物件的源**  2 不改變被裝飾物件的呼叫方法插入:time模組:

def

outer(x,y):

defmy_max():

if x > y: #

引用了outer 的引數,相當與引用了 outer的變數 為閉包函式

return

x

return

y

return

my_max

res = outer(80,90)

print(res())

裝飾無引數的函式

#

需求:裝飾器統計函式執行的時間

import

time

deff():

time.sleep(1)

print("

我是f"

)def outter(func): #

這裡的func形參被傳入實參f函式的記憶體位址

definner():

start =time.time()

func()

#這裡呼叫的是最初的f函式

end =time.time()

return end -start

return inner #

將inner函式的記憶體位址返回

f = outter(f) #

先執行括號裡的,將原f以引數的方式傳給outter返回 inner的記憶體位址,之後呼叫新定義的f,就等於呼叫了inner

print(f()) #

f() 就相當於呼叫了inner

裝飾有引數的函式

import

time

deff(name):

time.sleep(1)

print(f"我是"

)def outter(func): #

這裡的func形參被傳入實參f函式的記憶體位址

def inner(name): #

引數name是f的引數name

start =time.time()

func(name)

#這裡呼叫的是最初的f函式

end =time.time()

return end -start

return

inner

f = outter(f) #

先執行括號裡的,將原f以引數的方式傳給outter返回 inner的記憶體位址,之後呼叫新定義的f,就等於呼叫了inner

print(f('

yanglingayo

')) #

f() 就相當於呼叫了inner

裝飾器語法糖:語法糖在裝飾的時候要緊挨著被裝飾函式,當多個裝飾器裝飾乙個函式順序是重上至下,執行時候時由下至上

import

time

defoutter(func):

definner(name):

start =time.time()

func(name)

end =time.time()

return end -start

return

inner

@outter

#用@加上裝飾器函式名表示,放置於被裝飾函式的上方 此時等價與 f = outter(f)

deff(name):

time.sleep(1)

print(f"我是"

)print(f('

yanglingayo

'))

裝飾器的模板  

def

outter(func):

def inner(*args,**kwargs):

print('

執行被裝飾函式之前 你可以做的操作')

res = func(*args,**kwargs)

print('

執行被裝飾函式之後 你可以做的操作')

return

res

return inner

多個裝飾器裝飾乙個函式

裝飾器最終模板

from functools import

wraps

defoutter(func):

@wraps(func)

#裝飾器修復技術

def inner(*args,**kwargs):

print('

執行被裝飾函式之前 你可以執行的操作')

res = func(*args,**kwargs)

print('

執行被裝飾函式之後 你可以執行的操作')

return

res

return inner

多層裝飾器 

def

outter1(func1):

print('

載入了outter1')

print('')

res1=func1(*args,**kwargs)

return

res1

return

defoutter2(func2):

print('

載入了outter2')

print('')

res2=func2(*args,**kwargs)

return

res2

return

defoutter3(func3):

print('

載入了outter3')

print('')

res3=func3(*args,**kwargs)

return

res3

return

@outter1

#@outter2 #

@outter3 #

defindex():

print('

from index

')

這個我的理解是把被裝飾的函式當作乙個中心,他沒被裝飾一次就在他外面加了一層殼,當我呼叫執行這個被裝飾的函式時,他就像是要撥開這層殼.從外層往裡面一層層撥在這個過程會先由外向內的執行每層被裝飾函式之前執行的操作,當最終被裝飾函式執行完之後 在由內向外的執行每個裝飾器在執行完每層被裝飾函式的操作,就像用一根針從要穿透乙個有3層蛋殼的雞蛋

day11 閉包函式和裝飾器

目錄 閉包函式 裝飾器什麼是閉包函式?閉,封閉,把乙個函式封閉在另乙個函式裡面起來,就是定義在函式內部的函式 包,將它整體打包,同時引用外部函式作用域的名字,方便接下裡使用 x 56 defouter y 78 definner print x,y return inner 只要是呼叫了外部函式y的...

day 11 迭代器 閉包

1.第一類物件,函式名的使用,函式名就是變數名,函式名儲存的是函式的記憶體位址 溫習前面學過的變數 1 由數字,字母,下劃線組成 2 不能是數字開頭,更不能是純數字 3 不能用關鍵字 4 不要太長 5 要有意義 6 不要用中文 7 區分大小寫 8 駝峰線或者下劃線 2.閉包 在內層函式中引入外層函式...

Day 11 函式名,閉包,裝飾器 作業

1 整理裝飾器的形成過程,背誦裝飾器的固定格式 2 編寫裝飾器,為多個函式加上認證的功能 使用者的賬號密碼 於檔案 要求登入成功一次,後續的函式都無需再輸入使用者名稱和密碼 3.1.為題目3編寫裝飾器,實現快取網頁內容的功能 公升級題 4.寫函式,返回乙個撲克牌列表,裡面有52項,每一項是乙個元組 ...