修飾符基礎——閉包
什麼是閉包呢?標準的概念大家可以看wikipedia上的解釋
舉個例子:
def do_add(base):
def add(increase):
return base + increase
return add
do_add函式裡巢狀了乙個內層函式add,這個內層函式就是乙個閉包,其實可以也不用管這個「閉包」的概念,先來看下這種模式解決些什麼問題.
呼叫do_add函式:a = do_add(23),由於內層的函式add裡的邏輯用到了do_add函式的入參,而這時這個入參base繫結了值23,由於do_add函式返回的是函式add,所以這時的a其實就是內部的add繫結了23的函式add;同理可知,b = do_add(44),這裡的b就是內部add繫結了44的函式add,a和b這兩個add函式是不相同的,因為內部add繫結的值不同,只是兩個函式的模板相同罷了,這時我們執行a(100)得到結果是123,b(100)得到結果是144。這樣做有什麼用呢?其實可以這樣看:我們可以把a = do_add(23)和b = do_add(44)看成是配置過程,23和44是配置資訊,a(100)和b(100)根據不同的配置獲得不同的結果,這樣我們就可以解決開發中「根據配置資訊不同獲得不同結果」的問題
而修飾符實際上就是閉包一種形式,只是配置過程引數是所修飾的乙個函式,並且用@符號代替了a=do_add(23)這樣的配置方式,下面看一下修飾符的用法
修飾符用法
修飾符無引數,原函式無引數
import time
def timeit(func):
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
@timeit
def foo():
print 'in foo()'
foo()
在實際應用中,函式很少沒有引數,所以我們看看foo有引數的情況下,修飾符怎麼用
修飾符無引數,原函式有引數
import time
def timeit(func):
start = time.clock()
func(args)
end =time.clock()
print 'used:', end - start
@timeit
def foo(arg):
print 'in foo(),arg is' + arg
foo("aaaaa")
上述過程可以簡化如下:
如果修飾符函式也有引數,又怎麼用呢?
修飾符有引數,原函式有引數
import time
def timeit(s):
print "the decorator's arg is"+s
start = time.clock()
func(args)
end =time.clock()
print 'used:', end - start
@timeit(s="hello")
def foo(arg):
print 'in foo(),arg is' + arg
foo("aaaaa")
__同理,就是多加了一層閉包。 __
應用多個修飾符
這個記住乙個結論就好了,就是修飾符從離原函式最近的開始包裹,最外層的修飾符最後包裹
應用舉例——fibonacci數列
def memoize(f):
cache = {}
def helper(x):
if x not in cache:
cache[x] = f(x)
return cache[x]
return helper
@memoize()
def fib(n):
if n in (0, 1):
return n
else:
return fib(n - 1) + fib(n - 2)
參考文獻
python 修飾符 python訪問修飾符
許可權訪問 偽許可權,只是壓縮時按規則換了變數名,python 的哲學是假定使用者都會使用 xx 以單下劃線開頭的表示的是protected型別的變數。即保護型別只能允許其本身與子類進行訪問。若內部變數標示,如 當使用 from m import 時,不會將以乙個下劃線開頭的物件引入 成俗約定,不做...
python修飾符用法 python修飾符
乾貨大禮包!21天帶你輕鬆學python 文末領取更多福利 本課程來自於千鋒教育在阿里雲開發者社群學習中心上線課程 python入門2020最新大課 主講人姜偉。21天帶你輕鬆學python python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。大資料 人工智慧時代首選程式...
python 函式修飾符
def log func print log開始 func print log結束 如果log函式返回乙個字串,test就是乙個字串了 print test 輸出 log開始 test log結束 可見,test函式被替換了,但是其 name 屬性也變了。替換以後函式的一些屬性改變了,如 name ...