Python学习笔记之-----闭包
在函数式编程中,经常听到闭包。那么闭包到底是什么呢?使用闭包有什么好处?在python中又应该怎么使用呢?这里用几个小例子记录一下我了解到的python闭包。
什么是闭包
闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创始它的环境也不例外。所以,闭包是函数和与其相关的引用环境组合而形成的实体。
一个闭包的例子
1 | from urllib import urlopen |
在这个例子中,在page函数中,其内部的get函数作为返回值给返回了,在执行get()函数的时候,它会使用原来提供给page()函数的url去调用urlopen(url)。
如果想查看闭包中的变量内容,可以这样:
1 | >>baidu_page.__closure__ #可以看到其closure属性是一个元组 |
使用闭包需要注意的地方
闭包中是不能修改外部作用域的局部变量的
1 | def foo(): |
错误的使用局部变量
1 | def foo(): |
这样在调用的时候会产生错误,因为在bar内部,a在=号之前,被认为是bar的局部变量,等待赋值,而稍后去取a的值,而此时a是未被初始化的,所以会报一个a未定义的错误。解决这个问题的话,可以将a定义为一个可变变量,例如list
闭包的应用例子
在有的函数中,如果想让函数调用保持某个状态,那么使用闭包是一种非常有效的方式。
另外一个就是常用的装饰器了。
闭包有效的减少了函数所需定义的参数数目,便于用于并行计算。
参考链接
http://python.jobbole.com/82624/
https://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html
https://www.cnblogs.com/ChrisChen3121/p/3208119.html
http://python.jobbole.com/82296/
《python参考手册》