Python從零開始 day9 裝飾器 1

2022-08-11 20:15:21 字數 2694 閱讀 8189

裝飾器:

作用域 , 高階函式, 閉包

閉包:在乙個內部函式裡,對乙個外部作用域進行引用,那麼這個內部函式被認為是閉包

def

f():

x = 5

def fo(): #

內部函式

print(x) #

5 x是外部環境的變數

return fo #

fo()就是乙個閉包

f()()

foo= f() #

不能直接呼叫fo()函式,區域性變數,全域性變數無法呼叫

foo()

關於閉包,就是乙個內部函式加乙個外部環境變數

乙個簡單的裝飾器

import

time

deffunc():

start = time.time() #

獲取當前時間

print('

abc'

) time.sleep(0.05) #

停留時間

end =time.time()

print(end-start)

func()

帶有返回值的裝飾器

def timmer(f):  #

裝飾器函式

definner():

start =time.time()

ret = f() #

被裝飾的函式

end =time.time()

print(end-start)

return

ret

return

inner

@timmer

#語法糖 @裝飾器函式名

def func(): #

被裝飾的函式

time.sleep(0.01)

print('')

return

'新年好!'#

func = timmer(func) # 相當於是@timmer

ret = func() #

inner() 實際上inner()的呼叫函式是f();也就是func()--->inner()---->f()

print(ret)

裝飾器的作用:不想修改函式的呼叫方式,但是還想在原來的函式前後新增功能
原則:開放封閉原則
1、裝飾帶有引數的例項:
import

time

deftimmer(f):

definner(a):

start =time.time()

ret =f(a)

end =time.time()

return

ret

return

inner

@timmer

#func()=timmer(func)

deffunc(a):

time.sleep(0.01)

print('

',a) #

return

'新年好!

'ret = func(1) #

func()---->inner()---->f(),對func()傳引數也要對inner和f傳引數

print(ret) #

新年好!

2、傳動態引數的例項:
import

time

deftimmer(f):

def inner(*args,**kwargs):

start =time.time()

ret = f(*args,**kwargs)

end =time.time()

return

ret

return

inner

@timmer

#func()=timmer(func)

deffunc(a,b):

time.sleep(0.01)

print('

',a,b) #

return

'新年好!

'def func1(a,c=3):

time.sleep(0.01)

print('

',a,c) #

return

'新年好!

'ret = func(1,2) #

func()---->inner()---->f(),對func()傳引數也要對inner和f傳引數

ret1 = func1(1)

print(ret) #

新年好!

總結:最簡單的裝飾器----->帶有返回值的----->帶有乙個引數的----->帶有動態引數的(萬能引數的)
裝飾器的固定模式:
def inner(*args,**kwargs):

#在裝飾函式之前要做的事

ret = f(*args,**kwargs)

#在裝飾函式之後要做的事

return

ret

return

inner

deffunc():

#return

'新年好!

'ret =func()

print(ret)

Python從零開始 day4

列表 元組 字典 字典 python中唯一的對映型別,採用鍵值對 key value 的形式儲存資料 字典是無序的,且鍵必須為不可變型別 整型 字串 元組 不可變型別 整型 字串 元組 可變型別 列表 字典 dict 工作 designer print dict 愛好 特點 無序 鍵唯一 增加dic...

Python從零開始 day6

字串的內建方法 a 123 b abc print a 1 23 print a in b true c join a,b print c 123abc print c 123 abc st hello world print st.count l 統計某個元素的個數 print st.capita...

Python從零開始 day2

今天主要是學習if條件和while條件,並且對猜數字遊戲進行優化 比較三個數中的最大值和最小值 num1 input num1 num2 input num2 num3 input num3 輸入三個數 max num 0 定義乙個變數並賦值為0 if num1 num2 max num num1 ...