闭包是函数式编程的一个重要的语法结构,函数式编程是一种编程范式。
(而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。
函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
不同编程语言实现闭包的方式是不同的,python中闭包从表现形式上看,如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
再稍微讲究一点的解释是,闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境,当然这个环境可以有很多,不止一个简单的x。
首先给出闭包函数的必要条件:
- 闭包函数必须返回一个函数对象
- 闭包函数返回的那个函数必须引用外部变量(一般不能是全局变量),而返回的那个函数内部不一定要return
举个例子:
def outer(x):
def inner(y):
return x + y
return inner
闭包无法直接修改外部函数的局部变量
解决的方法:
1.在python3之前没有直接的解决方法,只能间接地通过容器类型来解决,因为容器类型不是存放在栈空间的,inner函数可以访问到。
2.python3通过nonlocal关键字来解决,该语句显式的指定x不是闭包的局部变量。
闭包的作用
用途1:当闭包执行完后,仍然能够保持住当前的运行环境。
用途2:闭包可以根据外部作用域的局部变量来得到不同的结果
以上两种使用场景,用面向对象也是可以很简单的实现的,但是在用Python进行函数式编程时,闭包对数据的持久化以及按配置产生不同的功能,是很有帮助的。