閉包 與 裝飾器

2022-05-08 23:33:10 字數 3336 閱讀 6737

函式引數

函式名儲存了函式所在的空間位址

函式名+ () 到函式所在的空間執行裡面的**

閉包:發生函式巢狀

外層函式有引數(內層函式使用到)

節省系統資源  提高**復用率的一種特殊語法

語法格式

def  外層函式(引數):

def 內層函式():

pass

return 內層函式

閉包流程

執行第五行 呼叫func_out 

執行2,3 行 func_in函式 只定以不執行  開闢乙個空間 暫且定為   0x11(),所以func_in=0x11

執行第四行  返回func_in 也就是0x11

然後到第五行 usa_rate= func_in= 0x11

執行第六行 0x11(100)  =  fun_in()

執行2,3 行**

1 1.def

func_out(rate):

2 2. def

func_in(money):

3 3. print(rate *money)

45 4. return

func_in

67 5.usa_rate = func_out(0.7)

8 6.usa_rate(100)

裝飾器  

在不改變原有**的前提下  還可以給函式增加新的功能

使用方法

@新加功能的函式名

裝飾器下面正好是函式

自動執行 login = func_out(login)

執行流程

執行第六行,首先裝飾器會自動執行一句話 login = func_out(login)

把7,8行**開闢乙個空間位址暫且叫做0x22, 當作引數傳給第一行func

執行第一行   0x22傳遞給func

2,3,4函式只定以不執行開闢乙個空間位址  暫且是 0x11

執行第五行  返回func_in  = =0x11 給函式呼叫者,  也就是 login = func_in== 0x11

然後執行login() == 0x11()==func_in(),到2,3,4**  

第四行  func() == login ==0x22=7,8行**

*** 執行流程結論***

func ==> 原始login  也就是0x22

新的login()0x11 ==>func_in()

1.def

func_out(func):

2. def

func_in():

3. print("驗證"

)4. func()

5. return

func_in

6.@func_out

7.def

login():

8. print("登入"

)9.login()

通用版裝飾器

def

func_out(func):

def func_in(*args,**kwargs):

return func(*args,**kwargs)

return

func_in

@func_out

def login(*args,**kwargs):

print

(args)

print(kwargs)

login(10,30,age = "123",name = "qwe")

多重裝飾器

執行流程

1.def

func_out01(func01):

2. print("

func_out01 is show")

3. def

func_in01():

4. print("

func01 is show")

5. func01()

6. return

func_in01

7.def

func_out02(func02):

8. print("

func_out02 is show")

9. def

func_in02():

10. print("

func02 is show")

11. func02()

12. return

func_in02

13.@func_out02

14.@func_out01

15.def

login():

16. print('

login is show')

17.login()

答案:func_out01

isshow

func_out02

isshow

func02

isshow

func01

isshow

login

isshow

首先執行13行 裝飾器func_out02下面不是函式,所以執行14行,

把15.16行開闢乙個空間暫且定義為0x11 ,把0x11當作引數傳遞給func01暫且存起來

執行func_out01,自動執行login = func_out(login)  login = 0x11 = func01

執行第二行  得出第乙個結果 --- func_out01  is show

3,4,5只定以不執行 開闢乙個空間 暫且定義以為  0x22

返回 0x22    新login = 0x22 = func_in01

14行變為乙個函式

執行裝飾器13行  自動執行 0x22=func_in01 == func_out02(0x22)

執行10行  func_in01 = func02 = 0x22   得出第二個結果 ----- func_out02  is show

把9,10,11  封裝起來  開闢乙個空間 稱為  0x33 

執行12行  返回給函式呼叫者  login = func_in02()

這時候執行login()

執行9,10,11 行**得出 第三個結果---  func02  is show

執行11行  fun02() = func_in01()-----得出func01  is  show

執行fun01()  得出  ==  login   is   show       fun01() = login

裝飾器與閉包

閉包 內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包。裝飾器 是裝飾器的符號 裝飾器是對閉包的一種利用,內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包,把呼叫的引數,換成函式,就是裝飾器,因為python中,函式也是當做物件,從而有裝飾器這一種特殊的用法。有引數的裝飾器就是在外面一層...

閉包與裝飾器

閉包 a 1 def inner return a return inner print ret 保證資料安全性 裝飾器 假裝分隔符 裝飾器def warpper f 這裡接受func記憶體位址,f是要被裝飾的函式的函式名,f就是相當於閉包裡面的自由變數 def inner args,kwargs ...

閉包與裝飾器

閉包函式 命名空間與作用域 函式巢狀 函式物件 核心點 名字的查詢關係是以函式定義階段為準 閉 函式指的該函式是內嵌函式 包 函式指的該函式包含對外層函式作用域名字的引用 不是對全域性作用域 方式一 直接把函式體需要的引數定義成形參 def f2 x print x f2 1 f2 2 f2 3 方...