有關閉包和裝飾器的知識點的理解著實花了我不少時間,整理筆記更是無從下手,但還是將從網上搜尋學習的點滴記錄下來以便後期的乙個補充學習。
閉包通俗地解釋就是通過呼叫了函式a,函式a返回了函式b,返回的函式b就是所謂的閉包,在呼叫函式a的時候傳遞的引數就是自由變數,該自由變數是被函式a引用的,在函式a的生命週期結束後仍然存在,這句話是至今能讓我比較能理解的解釋。
例如:123
4567
8>>>
def
func1(name):
#定義乙個函式func1
def
func2(age):
#函式func2()是在func1呼叫的時候產生的乙個閉包,且引用了自由變數name
print
name,age
return
func2
#函式呼叫完畢返回函式func2
>>> a
=
func1(
'lily'
)
#呼叫函式func1,且傳遞引數『lily』,將結果賦給a
>>> a(
24
)
#上一步的結果是返回函式func2,這時再將引數24賦給函式func1,呼叫函式func2
lily
24
閉包不能修改外部作用域的區域性變數:12
3456
78>>>
def
a():
x
=
1
#區域性變數x的值為1
def
b():
x
=
0
#在閉包內對x的值進行重新賦值
return
x
>>> a()
1
#結果是x的值沒有改變
使用閉包的好處呢乙個就是在閉包執行之後,儲存當前的執行環境,另乙個是通過外部作用域的變數可以返回不同的值。
裝飾器
裝飾器是閉包的使用場景之一,裝飾器其實也就是閉包的應用,只是區別的是裝飾器傳遞的引數是函式。裝飾器是將函式作為引數傳遞給乙個函式,並對其進行加工處理即裝飾返回乙個新的函式,裝飾器能保證在不改變已有的函式的結構,呼叫該函式返回乙個新的函式,極大地提高了效率。
使用識別符號@將裝飾器應用在函式上,只需要在函式的定義前加上@和裝飾器的名稱,即@decorator12
3@decorator
#直譯器將會解釋成:func=decorator(func),即將函式func作為引數傳遞給函式decorator,然後再返回新的函式賦值給func
def
func():
pass
多個decorator使用:12
34@decorator1
#func=decorator2(decorator1(func))
@decorator2
#func=decorator1(func)
def
func():
pass
再來乙個列印呼叫函式前log日誌的無引數的裝飾器例子:12
3456
78910
1112
1314
>>>
def
log(f):
def
*
args):
print
'call %s()'
%
(f.__name__)
return
f(
*
args)
return
>>> @log
def
func():
print
'hello,world'
>>> func()
call func()
hello,world
帶引數的裝飾器:
帶引數的裝飾器比不帶引數的裝飾器還要複雜一點,需要編寫乙個返回decorator的高階函式12
3456
78910
1112
1314
1516
>>>
def
log(text):
#3層巢狀的函式
def
decorator(f):
#返回decorator函式
def
*
args):
print
'%s %s()'
%
(text,f.__name__)
#將log的引數excute傳遞過來賦給text
return
f(
*
args)
return
return
decorator
>>> @log(
'excute'
)
def
func():
print
'hello,world'
>>> func()
excute func()
hello,world
>>>
12
>>> now.__name__
12
3456
78910
import
functools
def
log(text):
def
decorator(f):
@functools
.wraps(f)
def
*
args,
*
*
kw):
print
(
'%s %s():'
%
(text, f.__name__))
return
f(
*
args,
*
*
kw)
return
return
decorator
python閉包與裝飾器
首先閉包函式我的理解是,乙個函式內可以巢狀定義乙個函式,並將巢狀定義的函式返回 如果不返回執行完函式物件也就銷毀了 巢狀函式可以接收外部函式的引數,不同引數就可以變更巢狀函式的功能,返回不同功能的巢狀函式物件。以下是閉包函式簡單示例,如果inner函式不接收outer的引數x也就沒有意義了,一定要返...
Python閉包與裝飾器
一.閉包 如果乙個內嵌函式中引用了外部函式中的變數 非全域性變數 那麼該內嵌函式稱之為閉包 也就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件 閉包滿足的三個條件 1.必須是內嵌函式 2.外層函式返回值是內嵌函式 3.內嵌函式引用外層函式變數 def funx x def funy ...
Python 閉包與裝飾器
在函式內部再定義乙個函式,並且內部這個函式用到了外邊函式的變數,那麼將內部函式以及用到的一些變數稱之為閉包。兩個函式巢狀,外層函式返回內層函式的引用,外層函式必須傳引數 外層函式不傳參相當於只定義內層函式,沒有什麼用。注意點 由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消...