[Python]闭包(Closeure)
一.什么是闭包:
在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。—— 维基百科
闭包 = 内部函数 + 外部环境
二.代码例程
例程1:
n = 200; def ExFunc(n): sum_data = n; def InsFunc(x): return sum_data+x; return InsFunc func1 = ExFunc(10); print(func1(20));
结果:
30
我们尝试对例程1做一些改动,在InsFunc对sum_data 或者n做一些写入操作,那必须满足以下至少任一条件:
a.在InsFunc中对sum_data或n 使用 nonlocal 关键字进行修饰。
b.sum_data 或 n 在ExFuncbe本身是容器类型:
例程2:
def ExFunc(n): sum_data = n; def InsFunc(x): nonlocal sum_data; #对于非容器类型的sum_data,此处不用nonlocal修饰,将在下一句报错 sum_data *=2; return sum_data+x; return InsFunc func1 = ExFunc(10); print(func1(20));
结果:
40
例程3:
def ExFunc(l1): def InsFunc(l2): l1[0] = 'x'; return l1+l2; return InsFunc func1 = ExFunc([1,2,3,4,5]); print(func1([6,7,8,9,10]));
结果:
['x',2,3,4,5,6,7,8,9,10]
三.作用:
1.当闭包执行完后,仍然能够保持住当前的运行环境;
2.闭包可以根据外部作用域的局部变量来得到不同的结果,这有点像一种类似配置功能的作用,我们可以修改外部的变量,闭包根据这个变量展现出不同的功能。比如有时我们需要对某些文件的特殊行进行分析,先要提取出这些特殊行。
Ref:
http://baijiahao.baidu.com/s?id=1601023189180094497&wfr=spider&for=pc
https://www.cnblogs.com/JohnABC/p/4076855.html#commentform
http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html
~不再更新,都不让我写公式,博客园太拉胯了