zoukankan      html  css  js  c++  java
  • python学习笔记29:闭包基本概念

    1 什么是闭包

    创建闭包的方法:

    1. 定义一个外函数outer();
    2. outer()中定义一个临时变量;
    3. outer()中定义一个内函数inner();
    4. inner()中使用了outer中的临时变量;
    5. outer()的返回值是对inner的引用;
      这样就创建了一个闭包, 闭包的特性见第3节.

    2 闭包实例

    def outer():               #1. 定义一个外函数outer()
        _list_tmp = list()     #2. outer()中定义一个临时变量
        def inner(s_new_ele):  #3. outer()中定义一个内函数inner();
            _list_tmp.append(s_new_ele) #4. inner()中使用了outer中的临时变量;
            print(_list_tmp)
            return _list_tmp
        return inner           #5. outer()的返回值是对inner的引用;
    
    if __name__ == '__main__':
        outer_0 = outer()  # outer_0中绑定了一个临时变量_list_tmp
        outer_0('a')       # 返回['a']
        outer_0('b')       # 返回['a', 'b']
    
        outer_1 = outer()  # outer_1中绑定了另一个临时变量_list_tmp, 与outer_0中的相互独立
        outer_1('x')       # 返回['x']
        outer_1('y')       # 返回['x', 'y']
    
        outer_0('c')       # 返回['a', 'b', 'c']
        outer_1('z')       # 返回['x', 'y', 'z']
    

    3 闭包的特点

    1. 从外部读取函数内部的变量.
    2. 将创建的变量始终保持在内存中.
    3. 封装对象的私有属性和私有方法.

    一般情况下, 一个函数运行结束时, 函数内部的临时变量就销毁了.
    但闭包比较特殊, outer()运行结束后, 由于它的临时变量用在inner()中, 所以这个临时变量就绑定给inner()了.
    并且, 多次运行outer()函数返回的多inner中的临时变量是相互独立的.

    4 闭包的应用

    1. 装饰器.
    2. 面向对象, 由于临时变量在inner之间是相互独立的, 与class有相同的特点, 所以可以使用闭包来实现class(python的class不是用闭包实现的).
    3. 实现单例模式.
  • 相关阅读:
    CSS3-给网页添加图片
    CSS3-margin,padding,border
    布局左固定右自适应
    Java-基础编程(螺旋矩阵&乘法表)
    Java IO流整理Rick
    Java-Eclipse插件开发学习笔记
    关于《程序语言-平台优越性》一文补充说明
    程序语言-平台优越性
    Understand RNN with TensorFlow in 7 Steps
    pandas mean 返回 inf
  • 原文地址:https://www.cnblogs.com/gaiqingfeng/p/14006965.html
Copyright © 2011-2022 走看看