闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式(而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function)
;在面向对象编程中,我们见过对象(object)
。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
不同的语言实现闭包的方式不同。Python
以函数对象为基础,为闭包这一语法结构提供支持的(我们在特殊方法与多范式中,已经多次看到Python
使用对象来实现一些特殊的语法)。Python
一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。
函数引用
1 | def test1(): |
运行结果:
1 | --- in test1 func---- |
什么是闭包?
1 | # 定义一个函数 |
运行结果:
1 |
|
看一个闭包的实际例子
1 |
|
这个例子中,函数line
与变量a,b
构成闭包。在创建闭包的时候,我们通过line_conf
的参数a,b
说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)
。我们只需要变换参数a,b
,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。
如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性.
注意点:
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
修改外部函数中的变量
python3
的方法
1 |
|
python2
的方法
1 |
|