2012-02-17 185 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