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