所谓闭包,有2中定义。
1.子函数可以使用父函数中的变量
2.一个变量引用者未释放的可执行的代码块。
对第1点先举例:
def line_conf():
def line(x):
return 2*x+1
print(line(5)) # within the scope
line_conf()
print(line(5)) # out of the scope
#NameError: name 'line' is not defined
第2点举例:
def line_conf():
def line(x):
return 2*x+1
return line # return a function object
my_line = line_conf()
print(my_line(5))
对于闭包用于处理一些非常特殊的问题。
比如说,我的函数返回一个带有变量的方程。在Java,c++这种语言就很难实现了。
尤其是java里面,函数返回的,只能是一个结果,这个结果必须是一个对象或者是一个值。
通过闭包,这个问题就很好地解决了。
一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在Python中,所谓的闭包是一个包含有环境变量取值的函数对象。环境变量取值被保存在函数对象的__closure__属性中。比如下面的代码:
def line_conf():
b = 15
def line(x):
return 2*x+b
return line # return a function object
b = 5
my_line = line_conf()
print(my_line.__closure__)
print(my_line.__closure__[0].cell_contents)
__closure__里包含了一个元组(tuple)。这个元组中的每个元素是cell类型的对象。我们看到第一个cell包含的就是整数15,也就是我们创建闭包时的环境变量b的取值。
一个实际中的闭包case:
def line_conf(a, b):
def line(x):
return a*x + b
return line
line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))
ref:作者:Vamei 出处:http://www.cnblogs.com/vamei