一、閉包
閉包從形式上來說是在外部函式中定義內部函式,並且內部函式引用了外部函式的變數,此變數叫做自由變數。
或者說是將組成函式的語句和這些語句的執行環境打包在一起。
閉包滿足的條件:
必須有乙個內嵌函式
內嵌函式必須使用外部函式的變數
外部函式的返回值必須是內嵌函式
def closure():
value =
def fun(tmp):
value.append(tmp)
return value
return fun
cc = closure()
cc(程式設計客棧0) #[0] 等同於closure(fun(0))
cc(1) #[0,1]
cc(2) #[0,1,2]
外部函式closure中有變數value和內部函式fun,並且內部函式fun引用了自由變數value,當執行cc = closure()時,就產生了乙個閉包fun,該閉包持有只有變數value,當函式closure生命週期結束後,value依然存在,因為它被閉包引用了。
二、裝飾器
裝飾器其實就是閉包的應用,只不過其傳遞的是函式。
def add_time(fun):
def wrapper():
print('time: 12:00')
return fun()
return wrapper
def add_format(fun):
def wrapper():
print('\n')
return fun()
return wrapper
@add_format #等同於demo = add_format(add_time(demo))
@add_time #等同於 demo = add_time(demo)
def demo():
return 'hello world!'
另外,裝飾器會將demo函式的元資訊丟失,例如__name__等等。
例如demo函式的__name__會由'demo'變成了'wrapper',xpapqohlm這時需要用到functools庫,在wrapper函式前加上@functools.wraps(fun):
import functools
def add_time(fun):
@functools.wraps(fun)
def wrapper():
print('time: 12:00')
return fun()
return wrapper
def add_format(fun):
@functools.wraps(fun)
def wrapper程式設計客棧():
print('\n')
return fun()
return wrapper
@add_format #等同於demo = add_format(add_time(demo))
@add_time #等同於 demo = add_time(demo)
def demo():
return 'hello world!'
例如給任意函式加上列印時間的功能的裝飾器:
def metric(fn):
start=time.time()
def wrapper(*args,**kw):
end=time.time()
prxpapqohlmint('%s executed in %s ms' % (fn.__name__,start-end))
return fn(*args,**kw)
return wrapper
本文標題: python閉包及裝飾器執行原理解析
本文位址:
Python閉包及裝飾器
先看乙個例子 def outer x definner y return x y return innder add outer 8 print add 6 我們定義了乙個方法outer,方法內部又定義了乙個方法inner,方法outer返回值為內部定義的方法inner。同時,內部方法innder使...
Python 閉包及裝飾器
閉包是指延伸了作用域的函式。自由變數 free variable 指未在本地作用域中繫結的變數 函式裝飾器用於在原始碼中標記函式,以某種方式增強函式的行為。裝飾器實質,把被裝飾的函式替換為新函式,二者接收相同的引數,繫結了被裝飾函式最為自由變數,返回被裝飾函式本該返回的值,同時還會做些額外操作 裝飾...
Python 裝飾器 ,閉包
1 裝飾器 不改變被裝飾的函式情況下附加一些功能 本質是函式,用於裝飾其他函式,附加一些本身所沒有的功能 實質 是乙個函式 引數 是你要裝飾的函式名 並非函式呼叫 返回 是裝飾完的函式名 也非函式呼叫 作用 為已經存在的物件新增額外的功能 特點 不需要對物件做任何的 上的變動 例1 計算執行時長 i...