如果在一个内部函数里, 对在外部作用域(但不是在全局作用域) 的变量进行引用, 那么内部函数就被认为是闭包(closure)。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。
闭包在函数式编程中是一个重要的概念, Scheme和Haskell便是函数式编程中两种。 闭包从语法上看很简单(和内部函数一样简单) 但是仍然很有威力。
那么为什么你会想要用闭包?
闭包对于安装计算、 隐藏状态和在函数对象和作用域中随意地切换是很有用的。
闭包在GUI或者在很多API支持回调函数的事件驱动编程中是很有些用处的。 以绝对相同的方式, 应用于获取数据库行和处理数
据。 回调就是函数。 闭包也是函数, 但是他们能携带一些额外的作用域。 它们仅仅是带了额外特征的函数……另外的作用域。
闭包和函数调用没多少相关, 而是关于使用定义在其他作用域的变量。
def counter(start_at=0):
count=[start_at]
def incr():
count[0]+=1
return count[0]
return incr;
if __name__=="__main__":
print(counter(0)())
counter()做的唯一一件事就是接受一个初始化的值来开始计数, 并将该值赋给列表count唯一一个成员。 然后定义一个incr()的内部函数。
通过在内部使用变量count, 我们创建了一个闭包, 因为它现在携带了整个counter()作用域。 incr()增加了正在运行的count然后返回它。
然后最后的魔法就是counter()返回一个incr, 一个(可调用的) 函数对象。
注意counter(0)(),counter(0)返回的是incr,一个可调用的函数对象,所以后面加()
闭包更适合需要一个必需有自己的作用域的回调函数情况, 尤其是回调函数是很小巧而且简单的, 通常也很聪明。 跟平常一样, 如果你使用了闭包, 对你的代码进行注释或者用文档字符串来解释你正做的事是很不错的主意。 【意思是,如果你使用了闭包,就应当加上注释】