Python巢狀函式 閉包

2021-07-13 13:14:33 字數 2126 閱讀 7354

python中乙個與眾不同的語法就是可以巢狀函式,所謂巢狀,並不像其他語言中的在乙個函式中呼叫另乙個函式,

而是在定義乙個函式的時候,函式體裡還能定義另乙個函式。

內函式可以訪問外函式的作用域,這就是《python基礎教程》p105裡「它帶著它的環境(和相關的區域性變數)」及「由於python的巢狀作用域,來自外部作用域的這個變數,稍後會被內層函式訪問」。但是外部函式不能訪問內部函式的作用域。

下面用程式設計例項來詳細說明:

#在func_1()中定義了func_2(),func_2()中又定義了func_3()

def func_1():

x1 = "func_1"

#print("x1 = %s,x2 = %s,x3 = %s" % (x1,x2,x3))執行此句出現錯誤

print("in func_1: x1 = %s" % x1)

def func_2():

x1 = "func_1_redefined"

#將x2宣告為全域性變數,這樣才可以在其外層函式func_1()中使用

global x2 

x2 = "func_2"

print("in func_2: x1 = %s,x2 = %s" % (x1,x2))

def func_3():

x3 = "func_3"

print("in func_3: x1 = %s,x2 = %s,x3 = %s" % (x1,x2,x3))

return func_3()

#呼叫func_2()使global x2被定義使用

func_2()

print("in func_1,again: x1 = %s,x2 = %s" % (x1,x2))

下面是執行結果(環境是python 3.3.0): 

程式分析:

1)1只能訪問自己定義的變數,2可以訪問1和2中定義的變數但不能訪問3中的變數,3可以訪問所有變數;所以內部函式可以訪問其外部函式的作用域,但是外部函式不能訪問內部函式的作用域。

2)如果2中的變數被1訪問到,可以用gloabl對其宣告,但在使用前必須呼叫2。

3)若1,2中都有x1,則3中訪問到的是2中的x1(離它最近的作用域中的x1),1中的x1不變(不被重新賦值)。

我的總結:

當函式實現的功能比較複雜,**量比較大時,可以對函式進行分片,在這個函式的內部定義實現某一功能的函式,這樣做的好處是**易懂,並且可以對一部分變數封裝,避免對變數的誤操作。

書上說「儲存子封閉作用域的行為叫做閉包」。

python,函式巢狀,到底是個什麼東東?

很少有人用,但是,有時確實會用:

[python]view plain

copy

defmultiplier(factor):  

defmultiplybyfactor(number):  

return

number*factor  

return

multiplybyfactor  

python

程式,乙個函式在另外乙個函式的裡面,外層的函式返回的是裡層函式。也就是函式本身被返回了,返回的是函式(聽起來和c語言的一些東東相似)。

注意,返回的函式還可以訪問它的定義所在的作用域,也就是它帶著它的環境資訊奧。

看看下面的用法,就會有被水澆的感覺了:

[python]view plain

copy

>>>double = multiplier(

2)  

>>>double(5

)  10

>>>triple=multiplier(3

)  >>>triple(3

)  9

>>>multiplier(5)(4

)  >>>20

每次呼叫外層函式,它內部的函式都會被重新繫結,factor變數每次都有乙個新的值。

以上內容摘抄自《python基礎教程》

python函式巢狀閉包 閉包與巢狀函式

沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...

Python基礎 函式的巢狀和閉包

命名空間 python所有有關命名的操作都是在操作命名空間,例如變數名,函式名 1 內建命名空間 python直譯器提供好的功能,直譯器啟動跟著一起啟動,是全域性作用域 2 全域性命名空間 python中頂行寫的,不在函式內部定義的,都是全域性命名空間,在執行的時候會產生命名空間,是全域性作用域 3...

物件 巢狀和閉包函式

func 記憶體位址 def func print from func f func print f,func f def foo x x func的記憶體位址 print x x func foo func foo func的記憶體位址 def foo x x func的記憶體位址 return ...