18 python基礎7 閉包函式和裝飾器

2022-08-12 15:27:14 字數 2109 閱讀 4112

在函式內部定義的函式包含對外部作用域(非全域性作用域)的引用,這樣的函式叫做閉包函式。

示例:

#

----------------------------------

name='

tom'

deffunc():

name='

jack

'def

bar():

print

(name)

return

bar

f = func() #

f = bar

f() #

呼叫bar()

#輸出結果:

jack

上述**執行結果列印的是jack而不是tom,bar這個函式就是閉包函式。

閉包函式屬性:

閉包函式特點:

注意:

函式的作用域關係在函式定義階段就已經固定,與呼叫位置無關,無論函式在何處呼叫,都需要回到定義階段去找對應的作用域關係。

檢視乙個函式是否是閉包函式可以使用__closure__方法:

name='

tom'

deffunc():

name='

jack

'def

bar():

print

(name)

return

bar

f = func() #

f = bar

f() #

呼叫bar()

print(f.__closure__) #

如果是閉包函式返回引用的外部作用域物件

print(f.__closure__

[0].cell_contents)

#返回閉包函式引用外部作用域的值,[0]就是取第乙個物件的值,有多個也可以這樣取出

總結

閉包函式的基本形式:

#

def 外部函式名():

#內部函式需要的變數

#def 內部函式():

#引用外部變數

#return 內部函式

裝飾器本質上是乙個python函式,它可以讓其他函式在不需要做任何**變動的前提下增加額外功能,裝飾器的返回值也是乙個函式物件。概括的講,裝飾器的作用就是為已經存在的函式或物件新增額外的功能,使用裝飾器能夠使用原函式名呼叫實現除了原來功能之外的擴充套件功能。

定義比較抽象,下面舉個例子:

def

deco(func):

這個就相當於是修飾後的新函式

print('

before')

res = func(*args,**kwargs) #

意味著傳入函式可以接收可變長引數

print('

after')

return res #

這個返回值就是傳入函式的返回值

return

@deco

#def

foo(x,y):

print('

this is foo')

return x+y

foo(2,3) #

#print(foo(2,3)) #測試返回值

裝飾器的原則

裝飾器的作用

在不修改被裝飾物件源**以及呼叫方式的前提下為期新增新功能

多個裝飾器呼叫

@auth     #

foo = auth(time(foo))

@time #

foo = time(foo)

deffoo():

pass

呼叫順序可以理解為:先呼叫auth,再呼叫time,再呼叫foo。總結就是從外到內(從上往下)執行,判斷呼叫關係就是從內到外。相當於給foo函式增加了time功能和auth兩個功能,包了兩層,一層乙個功能。

python基礎 閉包函式

內包函式定義 內部函式包含對外部作用域而非全劇作用域名字的引用,該內部函式稱為閉包函式 函式內部定義的函式稱為內部函式 一 建立乙個閉包 使用外層函式的變數也是閉包 使用外層函式的形參也是閉包 def outter 本質就是 記憶體空間 name zs def inner print name 引用...

Python基礎學習簡記 閉包函式(Day7)

閉包是python裡關於函式定義的乙個很巧妙的方法,下面簡單介紹一下閉包。閉包是乙個兩層函式體,內層函式定義在外層函式內部,並且內層函式用到了外層函式的變數,那麼內層函式和用到的外層函式的變數統稱為閉包。最重要的是外層函式最後的返回值應當是內層函式的位址,或者說返回的是內層函式的引用。閉包 defd...

python基礎 閉包

摘自廖雪峰老師的部落格 返回閉包時,返回函式中不要引用任何後續可能變化的變數 如果一定要引用,就在原返回函式中再定義乙個函式,用該函式中的引數繫結可能變化的變數的當前值。def count fs for i in range 1,4 def f return i i return fs f1,f2,...