python內部函式、閉包共同之處在於都是以函式作為引數傳遞到函式,不同之處在於返回與呼叫有所區別。
python內部函式示例:
def test(*args):def add(*args): # 顯示的呼叫外部函式的引數
return args
return add(*args) # 返回內部函式的直接呼叫
執行結果如下:
test(1,2,3)
(1,2,3)
內部函式可以看作是乙個閉包。閉包是乙個可以由另乙個函式動態生成的函式,並且可以改變和儲存函式外建立的變數的值。
def test(a):def add(): # 沒用引用外部函式的引數
return "it's a callable %s" % a # 直接在內部函式使用外部函式的引數
return add # 返回內部函式本身,不返回內部函式呼叫
執行結果如下:
a1 = test(1) # 動態生成的乙個可以記錄外部變數的函式
a1() # 呼叫此函式
it's a callable 1
test(1)() # 本身呼叫過程,先動態生成乙個函式再進行呼叫
it's a callable 1
裝飾器實質上是乙個函式,它把乙個函式作為輸入並且返回另外乙個函式,在裝飾器中,通常使用下面這些python技巧:
python裝飾器示例:
def test(func): # 將函式作為引數進行傳遞def add(*args,**kwargs):
print 「it's a d」
return func(*args,**kwargs) # 內部函式進行相關操作以後,返回傳遞函式的呼叫
return add
def func(a,b):
return a+b
執行結果如下:
test(func) # 將func作為函式傳遞進test函式進行裝飾
# 裝飾後的函式,類似閉包
test(func)(1,2) # 顯示的對裝飾後的函式進行呼叫
it's a d # 中間被裝飾的過程被print出來
3更簡單的方法呼叫裝飾器
@test # 同乙個函式可以呼叫多個裝飾器,執行過程中不分先後順序
def func(a,b):
return a+b
無論傳入test()的函式func是什麼,裝飾器都會返回乙個新的函式,其中包含test增加的額外語句。
實際上,裝飾器並不需要執行函式func中的**,只是在結束前函式add呼叫函式func以得到的func返回的結果和附加**的結果
裝飾器本身需要傳遞引數的時候:
def test(cmd): # 將引數傳遞def exc(func): # 第二步進行函式作為引數傳遞
def add(*args,**kwargs):
print "it's a %s" % cmd
print "begin"
return func(*args,**kwargs)
return add
return exc
執行結果如下:
test('haha')
test('haha')(func)(1,2) # 呼叫裝飾器返回結果
it's a haha
begin 3
更簡單的方法呼叫
@test('haha') # test函式進行了引數傳遞
def func(a,b):
return a+b
python裝飾器注意事項:
對func進行裝飾以後,func的函式命名空間發生了變化
執行 func.__name__add
如何指向原來的命名空間呢?python自帶了functools庫直接呼叫則行
import functoolsdef test(func):
@functools.wraps(func)
def add(*args,**kwargs):
print "it's a decorator"
return func(*args,**kwargs)
return add
@test
def func(a,b):
return a+b
再次執行,檢視命名空間
func.__name__
func # 返回了本身
python裝飾器,閉包函式
閉包函式 在函式a內部定義另外乙個函式b,之後b作為a的返回值直接被返回。此時函式b稱為a的閉包函式。在閉包函式b中如果使用a函式中定義的變數,此時a函式中被定義的變數會被臨時儲存,直到b函式呼叫結束時該變數才會被系統收回,從而實現a中變數延遲釋放 例如global 宣告的變數屬於全域性變數,此時在...
Python 裝飾器 ,閉包
1 裝飾器 不改變被裝飾的函式情況下附加一些功能 本質是函式,用於裝飾其他函式,附加一些本身所沒有的功能 實質 是乙個函式 引數 是你要裝飾的函式名 並非函式呼叫 返回 是裝飾完的函式名 也非函式呼叫 作用 為已經存在的物件新增額外的功能 特點 不需要對物件做任何的 上的變動 例1 計算執行時長 i...
python基礎 閉包函式和裝飾器
首先我們應該知道一件事 函式的定義域跟定義位置有關係,而跟呼叫位置沒有關係。閉包函式 定義 內層函式對外層函式而非全域性變數的引用,就叫做閉包函式 閉包會一直存在在記憶體中,不會因為函式執行結束而被釋放 先看個例子 def outer num 1 definner nonlocal num num ...