Python 中的閉包 Closure

2021-07-31 12:01:37 字數 2297 閱讀 5130

在一些語言中,在函式中可以(巢狀)定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組「私有」變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。

—— 維基百科)

用比較容易懂的人話說,就是當某個函式被當成物件返回時,夾帶了外部變數,就形成了乙個閉包。看例子。

in [15]: def func(name):

...: def inner_func(age):

...: print('name',name,'age',age)

...: return inner_func

...:

in [17]: bb = func('tom')

in [18]: bb

out[18]:

in [19]: type(bb)

out[19]: function

in [20]: bb(18)

name tom age 18

這裡面呼叫func的時候就產生了乙個閉包——inner_func,並且該閉包持有自由變數——name,因此這也意味著,當函式func的生命週期結束之後,name這個變數依然存在,因為它被閉包引用了,所以不會被**。

另外再說一點,閉包並不是python中特有的概念,所有把函式做為一等公民的語言均有閉包的概念。

閉包的最大特點是可以將父函式的變數與內部函式繫結,並返回繫結變數後的函式(也即閉包),此時即便生成閉包的環境(父函式)已經釋放,閉包仍然存在,這個過程很像類(父函式)生成例項(閉包),不同的是父函式只在呼叫時執行,執行完畢後其環境就會釋放,而類則在檔案執行時建立,一般程式執行完畢後作用域才釋放,因此對一些需要重用的功能且不足以定義為類的行為,使用閉包會比使用類占用更少的資源,且更輕巧靈活,現舉一例:假設我們僅僅想列印出各類動物的叫聲,分別以類和閉包來實現:

類:

in [23]: class animal():

...: def __init__(self,animal):

...: self.animal = animal

...: def sound(self,voice):

...: print(self.animal,':',voice,'...')

...:

in [24]: dog = animal('dog')

in [25]: dog.sound('wang~wang~')

dog : wang~wang~ ...

in [26]: dog.sound('wo~wo~')

dog : wo~wo~ ...

閉包:

in [28]: def voice(animal):

...: def sound(voc):

...: print(animal,':',voc,'...')

...: return sound

...:

in [29]: dog = voice('dog')

in [30]: dog('wangwangwang~')

dog : wangwangwang~ ...

in [31]: type(dog)

out[31]: function

in [32]: dog

out[32]:

可以看到輸出結果是完全一樣的,但顯然類的實現相對繁瑣,且這裡只是想輸出一下動物的叫聲,定義乙個animal 類未免小題大做,而且voice 函式在執行完畢後,其作用域就已經釋放,但animal 類及其例項 dog的相應屬性卻一直貯存在記憶體中

in [33]: id(animal.sound)

out[33]: 2044388328584

而這種占用對於實現該功能後,則是沒有必要的。

除此之外,閉包還有很多其他功能,比如用於封裝等,另外,閉包有效的減少了函式引數的數目,這對平行計算非常有價值,比如可以讓每台電腦負責乙個函式,然後串起來,實現流水化的作業等。

python 的閉包和裝飾器

說說python中的閉包 - closure

python中閉包 python中的閉包

一 定義 如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 這個定義是相對直白的,閉包有三個條件 1.函式巢狀 2,內部函式呼叫外部函式的變數 3.返回內部函式 defa a defb b s a breturnsreturnb ...

python 閉包 Python中的閉包

一 什麼是閉包 在談之前,我們先來說說作用域,變數的作用域無非就兩種 全域性變數和區域性變數。函式內部可以直接讀取全域性變數,但是在函式外部無法讀取函式內部的區域性變數。出於種種原因,我們有時候需要獲取到函式內部的區域性變數。但是,正常情況下,這是辦不到的!只有通過變通的方法才能實現。於是就引入了閉...

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...