闭包
什么是闭包
在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
我的理解:
1、一个函数在内部定义了一个函数
def f1():
def f2():
pass
2、内部函数f2使用了外部函数f1的变量
def f1():
num=1
def f2():
print(num)
3、可以用来在一个函数与一组“私有”变量之间创建关联关系—>个人理解 能在外部使用到外层函数的内部变量,只需要将内部的f2返回出去就OK
def f1():
num=1
def f2():
print(num)
return f2
a = f()
a()
这是我们就可以在外部看到函数f1的私有值num
这样的函数就称之为闭包
闭包有什么作用
作用1:闭包是将外层函数内的局部变量和外层函数的外部连接起来的一座桥梁。
作用2:将外层函数的变量持久地保存在内存中。
上一个例子看着非常的鸡肋 返回一个内部值用得着这样吗?我直接在f1 return num不就好了吗 用得着再定义一个f2吗 别急 再接着往下看 看完你觉得还是鸡肋的话 你就…憋着吧 反正你也打不着我(告辞)
作用1 闭包是将外层函数内的局部变量和外层函数的外部连接起来的一座桥梁
闭包存在的意义就是它夹带了外部变量(私货),如果它不夹带私货,它和普通的函数就没有任何区别。同一个的函数夹带了不同的私货,就实现了不同的功能。
其实你也可以这么理解,闭包和面向接口编程的概念很像,可以把闭包理解成轻量级的接口封装。
----Wayne
这里的私货指的是外层函数f1的私有变量 例如:
def f1(tag):
def f2(text):
return "<{0}>{1}</{0}>".format(tag, text)
return f2
content = 'python'
a = f1('p')
print(a(content))
上面的代码当中 实现了给content文本自动添加HTML标签 其中标签p就是私货 当然 你也可以按照下面的常规写法书写:
def f3(content):
return '<p>{}</p>'.format(content)
但是 如果需求改变 需要添加img标签呢 你还得再写一个f4吗?
def f1(tag):
def f2(text):
return "<{0}>{1}</{0}>".format(tag, text)
return f2
content = 'python'
a = f1('img')
print(a(content))
使用这种方法可以实现高复用 在上面的例子当中 可以将f1当作一个类 a=f1()就是在实例化 其中传入的参数就他的属性再次调用 a()的时候实际就是在调用f2方法 注意外层函数返回的是f2 当调用a的时候是执行的f2 因此可以理解为 a=f1(‘img’) 在实例化f1 初始化了tag参数 此时的a是f2 再次调用a(content)时 传入的content是f2在接收参数(text)
作用2:将外层函数的变量持久地保存在内存中。
def f1(b=[0, 0]):
def f2(num1, num2):
# num1 = num1 + num2
b[0] += num1
b[1] += num2
return b
return f2
a = f1()
print(a(1,1))
print(a(1,1))
print(a(1,1))
输出:
[1, 1]
[2, 2]
[3, 3]
可以看到变量b被持续保存 而没有因为f1调用完而被python的回收机制销毁,二十被长久的存入了内存当中