• [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

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    Select列表操作函数
    IBM职业之路—职业规划和技术发展(转自LU)听听前辈的意见
    C#上传下载文件ftp操作类FTPClient代码(转)
    C# FTP操作类
    UML基础
    DevExpress控件之XtraTreeList
    认识UML类图元素
    C#读写EXCEL
    C#正则表达式整理备忘
    面向对象程序可视化类图的逆向自动生成
  • 原文地址:https://www.cnblogs.com/alimy/p/10383507.html
Copyright © 2020-2023  润新知