python閉包的
阿新 • • 發佈:2018-11-13
昨天初次接觸閉包,始終覺得理解閉包猶如霧裡看花,捉摸不透,但今日再看時有了些許靈感。
如下例
import time, functools
def performance(unit):
def _per(f):
@functools.wraps(f)
def fn(*args,**kw):
t1=time.time()
r=f(args,**kw)
t2=time.time()
print (‘call %s() in %fs %s’ % (f.name, (t2 - t1),unit))
return r
return fn
return _per
@performance(‘ms’)
def factorial(n):
return reduce(lambda x,y: x
print(factorial(10))
首先,對於閉包基礎的理解應該是將原來的函式作為引數傳到裝飾器函式中。進行新增後再將名字賦為原來的名字。 但在具體實施中讓人總覺一頭霧水。對此,我的理解是閉包就是對於引數的閉包!
如上例,進行 print(factorial(10))程式碼時,首先將裝飾器引數‘ms’,函式,函式引數(在這裡也就是10)打包,首先將裝飾器引數傳給performance函式,實現帶參裝飾器,閉包之後的函式,接著將函式factiorial傳給_per,此時便是如同不帶參裝飾器的操作,再將函式引數10給fn 實現帶參裝飾器 所以在學習裝飾器時要分清每個函式接受的是什麼引數然後不斷閉包reuturn
但是,在進行裝飾器函式後,對函式的屬性發生了改變,如上例,函式factorial實際已經變為了fn 考慮到可能影響其他程式碼段 使用@functools.wraps(f)將函式屬性更改過來