[python]閉包究竟是什麼鬼?

這些東西是我在慕課網,廖雪峯大神的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)
相關文章
相關標籤/搜索