python闭包
2017-06-10 本文已影响0人
壁花烧年
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。在了解闭包之前,先了解一下函数的引用。
def test():
print('...test...')
test()
t1 = test
t1()
print(id(test))
print(id(t1))
print('*'*15)
结果如下:

那闭包是如何在函数内引用函数的?看如下代码:
def test(number):
def test_in(number_in):
print('test_in的number_in是:%s'%number_in)
return number+number_in
return test_in
t1 = test(10)
print(t1(20))
print(t1(30))
结果如下:

接下来看一个闭包的实际例子,定义一个函数曲线,给定x的值求y的值。
def fun1(k,b):
def fun1_in(x):
print('x的值是:%s'%x)
return k*x+b
return fun1_in
f1 = fun1(2,1)
print(f1(3))
结果如下:

这个例子中,函数fun1与变量k,b构成闭包。在创建闭包的时候,我们通过fun1的参数k,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y=kx+b)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。
如果没有闭包,我们需要每次创建直线函数的时候同时说明k,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。
闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成。
但由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。