闭包
1.闭包的介绍
面向过程编程(函数)和面向对象编程(对象)都是一种编程范式,函数和对象本质是将代码以某种逻辑组织起来,提高代码的复用性。而闭包也是一种代码组织的方式,同样也会提高代码的复用性。
不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们想使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。
2. 闭包
函数是一个对象,所以可以作为某个函数的返回结果
def line_conf():
b = 15
def line(x):
return 2*x+b
return line
my_line = line_conf()
print(my_line(4))
# 输出结果是23
在上面的代码中,line定义的隶属程序块中引用了高层的变量b,但b信息存在于line之外,我们称b为line的环境变量。事实上,line作为line_conf的返回值时,line中已经包括b的取值。
一个函数和它的环境变量聚合在一起,就构成了一个闭包。所谓的闭包是一个包含有环境变量取值的函数对象,环境变量取值被保存在函数对象的__closure__属性中.
def line_conf():
b = 15
def line(x):
return 2*x+b
return line
my_line = line_conf()
print(my_line.__closure__)
print(my_line.__closure__[0].cell_contents)
# 输出如下
#(<cell at 0x000002722B9BDCA0: int object at 0x00007FFAFFDB1860>,)
#15
3.为什么使用闭包
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))
如上的代码中,我们只需要更换参数a,b,就可以获得不同的直线表达函数。如果没有闭包的话,需要每次创建函数直线的同时说明a,b,x,但这样就需要更多的参数传递,也减少了代码的可用性。利用闭包,我们实际上创建了泛函。
参考博客:
https://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html

浙公网安备 33010602011771号