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

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    js基础
    js 一个数组改成两个一组两个一组
    微信中h5网页跳转小程序
    微信“分享到朋友圈”wx.onMenuShareTimeline() 和 onMenuShareAppMessage 分享给朋友
    小程序 服务器端调用接口获取小程序太阳码 前端接收问题
    小程序calc不生效的原因
    Delphi App集成DPush
    kbmMW Server服务端集成DPush推送
    ChinaCock扫描Demo存在闪退问题的解决方法
    Delphi 原生支持JSON的链式写法
  • 原文地址:https://www.cnblogs.com/alimy/p/10383507.html
Copyright © 2020-2023  润新知