闭包(closure)是函数式编程的重要的语法结构,函数式编程是一种编程范式(而面向过程编程和面向对象编程也都是编程范式)
在面向过程编程中,我们见到过函数(function)
不同的语法实现闭包的方式不同,python以函数对象为基础,为闭包语法结构提供支持的
def line_conf(a, b):
def line(x):
return a*x + b
return line
a=line_conf(3,4)
print a
print type(a)
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/eee/a6.py
<function line at 0x021E0A70>
<type 'function'>
Process finished with exit code 0
def line_conf(a, b):
def line(x):
return a*x + b
return line
a=line_conf(3,4)
print a
print type(a)
print a(6)
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/eee/a6.py
<function line at 0x021A0A70>
<type 'function'>
22
由于python的静态嵌套域,如我们早先看到的,定义内部函数变得很有用处。在下面的部分中,
我们将着重讨论作用域和lambda,但是在python2.1之前,当作用域规则变为今天这样之前,内部函数也会遭受相同的问题。
简单的闭包例子:
下面是使用闭包简单的例子,我们会模拟一个计数器,同样也通过将整数包裹位一个列表的单一元素来模拟使整数
def counter(start_at=0):
x=start_at
def incr():
y=x+9
return y
return incr
count=counter(5)
print count()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/eee/a7.py
14
counter()做的唯一一件事就是接受一个初始化的值来开始计数,并将该值赋给列表count唯一一个成员。
然后定义一个incr()的内部函数。
通过在内部使用变量count,我们创建了一个闭包因为它现在携带了整个counter()作用域。
然后最后的魔法就是counter()返回一个inct,一个可调用的函数对象。