Python深入04 閉包

2021-06-26 03:43:53 字數 1149 閱讀 5600

閉包(closure)是函式式程式設計的重要的語法結構。函式式程式設計是一種程式設計正規化 (而面向過程程式設計和物件導向程式設計也都是程式設計正規化)。在面向過程程式設計中,我們見到過函式(function);在物件導向程式設計中,我們見過物件(object)。函式和物件的根本目的是以某種邏輯方式組織**,並提高**的可重複使用性(reusability)。閉包也是一種組織**的結構,它同樣提高了**的可重複使用性。

不同的語言實現閉包的方式不同。python以函式物件為基礎,為閉包這一語法結構提供支援的 (我們在特殊方法與多正規化中,已經多次看到python使用物件來實現一些特殊的語法)。python一切皆物件,函式這一語法結構也是乙個物件。在函式物件中,我們像使用乙個普通物件一樣使用函式物件,比如更改函式物件的名字,或者將函式物件作為引數進行傳遞。

函式物件的作用域

和其他物件一樣,函式物件也有其存活的範圍,也就是函式物件的作用域。函式物件是使用def語句定義的,函式物件的作用域與def所在的層級相同。比如下面**,我們在line_conf函式的隸屬範圍內定義的函式line,就只能在line_conf的隸屬範圍內呼叫。

def line_conf():

def line(x):

return 2*x+1

print(line(5)) # within the scope

line_conf()

print(line(5)) # out of the scope

line函式定義了一條直線(y = 2x + 1)。可以看到,在line_conf()中可以呼叫line函式,而在作用域之外呼叫line將會有下面的錯誤:

nameerror: name 'line' is not defined

說明這時已經在作用域之外。

同樣,如果使用lambda定義函式,那麼函式物件的作用域與lambda所在的層級相同。

閉包函式是乙個物件,所以可以作為某個函式的返回結果。

def line_conf():

def line(x):

return 2*x+1

return line # return a function object

my_line = line_conf()

print(my_line(5))

上面的**可以成功執行。line_conf的返回結果被賦給line物件。上面的**將列印11。

Python深入04 閉包

python深入04 閉包 閉包 closure 是函式式程式設計的重要的語法結構。函式式程式設計是一種程式設計正規化 而面向過程程式設計和物件導向程式設計也都是程式設計正規化 在面向過程程式設計中,我們見到過函式 function 在物件導向程式設計中,我們見過物件 object 函式和物件的根本...

Python深入04 閉包

閉包 closure 是函式式程式設計的重要的語法結構。函式式程式設計是一種程式設計正規化 而面向過程程式設計和物件導向程式設計也都是程式設計正規化 在面向過程程式設計中,我們見到過函式 function 在物件導向程式設計中,我們見過物件 object 函式和物件的根本目的是以某種邏輯方式組織 並...

Python 深入理解閉包

函式物件是使用def語句定義的,函式物件的作用域與def所在的層級相同。比如下面 我們在line conf函式的隸屬範圍內定義的函式line,就只能在line conf的隸屬範圍內呼叫。def line conf def line x return 2 x 1 print line 5 within...