Python閉包與裝飾器

2021-08-20 14:56:26 字數 1429 閱讀 2478

一.閉包

如果乙個內嵌函式中引用了外部函式中的變數(非全域性變數)。那麼該內嵌函式稱之為閉包

也就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件

閉包滿足的三個條件:

1.必須是內嵌函式

2.外層函式返回值是內嵌函式

3.內嵌函式引用外層函式變數

def funx(x):

def funy(y):

return x*y

def funz(z):

return x*z

return funy,funz

y,z=funx(5) #接收兩個內嵌函式

print(y(2),z(3)) #分別呼叫

閉包:python解析變數的legb法則,local>enclosing>global>bulitin ,在任何一層找到以後結束查詢

local代表本地變數即內嵌函式內變數,

enclosing代表外層函式變數,如果是巢狀外層,則由內向外一直查詢

global全域性變數,即查詢當前模組的變數

bulitin內建模組的預定義變數中查詢

下面來乙個例子幫助了解:

#foo.py

filename="foo.py"

def call_func(f):

return f()

import foo #匯入foo.py模組

filename="func.py"

def show_name():

print(filename)

call_func(show_name) #輸出func.py

原因:由於閉包是封存上下文環境,所以call_func(show_name)會使用內嵌函式show_name的上下文

用legb法則解釋:show_name函式和其外部裡沒有filename變數,就去當前模組func.py中查詢該變數

二.裝飾器&語法糖

裝飾器是閉包的應用,在不修改原函式**的情況下,對函式包裝,為函式新增功能

def gd(fun):

return fun()+'我吃火鍋,你吃火鍋底料\t'

def kt(fun):

return fun()+'我吹空調,你吹空調外機\t'

@gd@kt

def test():

return '我吃冰棍,你吃冰棍棒棒\t' # 相當於gd(kt(test)())

print(test())

總結:閉包是典型的惰性賦值,外層函式區域性變數不會丟失,會被封裝到內嵌函式的環境中

python閉包與裝飾器

首先閉包函式我的理解是,乙個函式內可以巢狀定義乙個函式,並將巢狀定義的函式返回 如果不返回執行完函式物件也就銷毀了 巢狀函式可以接收外部函式的引數,不同引數就可以變更巢狀函式的功能,返回不同功能的巢狀函式物件。以下是閉包函式簡單示例,如果inner函式不接收outer的引數x也就沒有意義了,一定要返...

Python 閉包與裝飾器

在函式內部再定義乙個函式,並且內部這個函式用到了外邊函式的變數,那麼將內部函式以及用到的一些變數稱之為閉包。兩個函式巢狀,外層函式返回內層函式的引用,外層函式必須傳引數 外層函式不傳參相當於只定義內層函式,沒有什麼用。注意點 由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消...

python 閉包與裝飾器

如果乙個函式內部定義了乙個函式,我在稱外面這個函式為外函式,裡面的這個函式為內函式 如果內函式內部使用了外函式的臨時變數,並且外函式的返回值是內函式的引用,這種形式稱之為函式閉包 def test func def call func print func print return call fun...