python閉包與裝飾器

2022-03-30 06:26:25 字數 4539 閱讀 1446

有關閉包和裝飾器的知識點的理解著實花了我不少時間,整理筆記更是無從下手,但還是將從網上搜尋學習的點滴記錄下來以便後期的乙個補充學習。

閉包通俗地解釋就是通過呼叫了函式a,函式a返回了函式b,返回的函式b就是所謂的閉包,在呼叫函式a的時候傳遞的引數就是自由變數,該自由變數是被函式a引用的,在函式a的生命週期結束後仍然存在,這句話是至今能讓我比較能理解的解釋。

例如:123

4567

8>>>deffunc1(name):#定義乙個函式func1

deffunc2(age):#函式func2()是在func1呼叫的時候產生的乙個閉包,且引用了自由變數name

printname,age

returnfunc2#函式呼叫完畢返回函式func2

>>> a=func1('lily')#呼叫函式func1,且傳遞引數『lily』,將結果賦給a

>>> a(24)#上一步的結果是返回函式func2,這時再將引數24賦給函式func1,呼叫函式func2

lily24

閉包不能修改外部作用域的區域性變數:12

3456

78>>>defa():

x=1#區域性變數x的值為1

defb():

x=0#在閉包內對x的值進行重新賦值

returnx

>>> a()

1#結果是x的值沒有改變

使用閉包的好處呢乙個就是在閉包執行之後,儲存當前的執行環境,另乙個是通過外部作用域的變數可以返回不同的值。

裝飾器

裝飾器是閉包的使用場景之一,裝飾器其實也就是閉包的應用,只是區別的是裝飾器傳遞的引數是函式。裝飾器是將函式作為引數傳遞給乙個函式,並對其進行加工處理即裝飾返回乙個新的函式,裝飾器能保證在不改變已有的函式的結構,呼叫該函式返回乙個新的函式,極大地提高了效率。

使用識別符號@將裝飾器應用在函式上,只需要在函式的定義前加上@和裝飾器的名稱,即@decorator12

3@decorator#直譯器將會解釋成:func=decorator(func),即將函式func作為引數傳遞給函式decorator,然後再返回新的函式賦值給func

deffunc():

pass

多個decorator使用:12

34@decorator1#func=decorator2(decorator1(func))

@decorator2#func=decorator1(func)

deffunc():

pass

再來乙個列印呼叫函式前log日誌的無引數的裝飾器例子:12

3456

78910

1112

1314

>>>deflog(f):

def*args):

print'call %s()'%(f.__name__)

returnf(*args)

return

>>> @log

deffunc():

print'hello,world'

>>> func()

call func()

hello,world

帶引數的裝飾器:

帶引數的裝飾器比不帶引數的裝飾器還要複雜一點,需要編寫乙個返回decorator的高階函式12

3456

78910

1112

1314

1516

>>>deflog(text):#3層巢狀的函式

defdecorator(f):#返回decorator函式

def*args):

print'%s %s()'%(text,f.__name__)#將log的引數excute傳遞過來賦給text

returnf(*args)

return

returndecorator

>>> @log('excute')

deffunc():

print'hello,world'

>>> func()

excute func()

hello,world

>>>12

>>> now.__name__12

3456

78910

importfunctools

deflog(text):

defdecorator(f):

@functools.wraps(f)

def*args,**kw):

print('%s %s():'%(text, f.__name__))

returnf(*args,**kw)

return

returndecorator

python閉包與裝飾器

首先閉包函式我的理解是,乙個函式內可以巢狀定義乙個函式,並將巢狀定義的函式返回 如果不返回執行完函式物件也就銷毀了 巢狀函式可以接收外部函式的引數,不同引數就可以變更巢狀函式的功能,返回不同功能的巢狀函式物件。以下是閉包函式簡單示例,如果inner函式不接收outer的引數x也就沒有意義了,一定要返...

Python閉包與裝飾器

一.閉包 如果乙個內嵌函式中引用了外部函式中的變數 非全域性變數 那麼該內嵌函式稱之為閉包 也就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件 閉包滿足的三個條件 1.必須是內嵌函式 2.外層函式返回值是內嵌函式 3.內嵌函式引用外層函式變數 def funx x def funy ...

Python 閉包與裝飾器

在函式內部再定義乙個函式,並且內部這個函式用到了外邊函式的變數,那麼將內部函式以及用到的一些變數稱之為閉包。兩個函式巢狀,外層函式返回內層函式的引用,外層函式必須傳引數 外層函式不傳參相當於只定義內層函式,沒有什麼用。注意點 由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消...