這些東西是我在慕課網,廖雪峯大神的python課中學到的。本身寫成筆記的形式分享給你們。python
先來看一段代碼:閉包
1 def f1(x): 2 return x*x 3
4 def new_fn(f): 5 def fn(j): 6 print 'print'+f.__name__
7 return f(j) 8 return fn 9
10 g1 = new_fn(f1) 11 print g1(5)
運行結果:函數
printf1 25
1.爲何會用到閉包?spa
在不修改f1函數的前提下,輸出f1函數的名稱code
2.閉包是個什麼鬼?orm
new_fn()函數傳入一個參數f(f是一個函數),new_fn()中有一個fn()函數,這個就是增長參數功能的地方。對象
fn()函數能夠使用new_fn()函數接收的參數f。blog
3.實例化的時候g1 其實就是函數fn()(不許確可是好理解),傳入的參數f1就是要增長功能的函數。it
這裏須要注意的是,g1是一個函數名,加上()就能看成函數來用了。(由於fn返回的是一個函數對象)form
總結:
a.閉包就是爲了避免動原函數裏面的代碼,還要給它增長‘性功能’的一種手段。
b.經過外面的一層層的函數傳遞的參數,讓最內層的函數能夠直接調用外層函數全部參數,從而實現不動原函數的代碼,增長新功能的辦法。
最後,在python中,修飾器就是最好的體現:
看一段代碼:
實現輸出傳入參數運行了多長時間,並輸出,時間單位是傳入的參數。
import time def performance(unit): def performance_decorator(f): def p(x): t1 = time.time() r = f(x) t2 = time.time() print 'call %s() in %f %s' % (f.__name__, t2 - t1, unit) return r return p return performance_decorator @performance('ms') def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)