[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

posted @ 2019-02-15 14:31  Alimy  阅读(408)  评论(0编辑  收藏  举报