2012-02-17 89 views
2

the python tutorial,功能尋找在封閉函數的符號表變量名尋找全局函數之前:封裝函數是什麼?

一個函數的執行介紹用於函數的局部變量一個新的符號表。更確切地說,函數中的所有變量賦值都將值存儲在本地符號表中;而變量引用首先在本地符號表中查找,然後在封閉函數的本地符號表中,然後在全局符號表中,最後在內置名稱表中查找。因此,全局變量不能直接在函數內賦值(除非在全局語句中命名),儘管它們可能被引用。

「封閉功能」是什麼意思,什麼時候使用?

我看到下面的代碼打印10稱爲

def parent_function(): 
    y=10 
    def child_function(): 
     print y 
    child_function() 

當但是,調用child_function()單獨產生錯誤。封閉函數使用頻繁嗎?

回答

7

封閉函數的概念是理解閉包的思想的關鍵。因爲Python沒有全功能的lambda(他們只允許表達式,而不是語句),其嵌套函數傳授給其他的功能是一種常見的用例:

def receiving_function(f): 
    f() 

def parent_function(): 
    y=10 
    def child_function(): 
     print y 
    receiving_function(child_function) 

會之前打印10。這是一個閉包的常見實例,其中封閉函數將它的變量釋放到所包含的函數中。在上面的例子中,這個函數被傳遞給receiving_function以及非本地變量y

+0

謝謝。我仍然有點困惑,當這將是有用的功能,這可能是因爲我不知道什麼是閉包 – dandelion 2012-02-17 22:22:28

+2

這是一個很好的,但單獨的問題。例如,考慮'y = 10'不是一個簡單的賦值,但實際上是一個非常昂貴的操作,需要'child_function'。考慮一下,不是一個'child_function',你有很多。不必在每個單獨的函數中放置這個非常昂貴的計算,並且可以在每次函數調用時計算它,您可以將其封裝在一個閉包中,併爲這個假設的「child_functions」集計算。看看[這](http://stackoverflow.com/questions/1305570/closures-why-are-they-so-useful)一些有用的答案。 – malloc47 2012-02-18 01:03:36

2

您不能自己撥打child_function的原因是它在parent_function的內部定義。所有的python變量聲明都使用塊範圍,並且聲明一個函數也沒有什麼不同。

考慮下面的例子。

>>> def parent_function(): 
... y=10 
... def child_function(): 
...  print y 
... child_function() 

>>> print y 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
NameError: name 'y' is not defined 

可變y不是parent_function外部接近。爲什麼你會期望child_function會有什麼不同,y

+0

根據你的代碼,它意味着y,child_function都是parent_function()的本地對象,並且我們沒有從parent_function()之外的y和child_function獲得任何返回值? – Praneeth 2015-06-11 14:53:51

2

包圍函數是嵌套在函數中的函數。 我們通常使用它來獲得更好的封裝。 這是封閉函數不可見其他功能。

+2

我認爲你把「封閉」和「封閉」混淆在一起:一個封閉函數不需要嵌套在任何東西中,但是必須嵌套它(否則沒有封閉) – DSM 2012-02-17 04:28:29