python 裝飾器 內部函式 閉包簡單理解

2022-08-24 13:39:10 字數 2626 閱讀 7458

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 functools

def 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 ...