zoukankan      html  css  js  c++  java
  • Python闭包和装饰器再复习

    • 闭包

    闭包的定义

    在一个外函数中定义了一个内函数,并且内函数用到了外部函数的变量,而且外函数的返回值内函数的引用,这就构成了一个闭包。

            一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

    当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 重点是函数运行后并不会被撤销,只是迁移到内函数上 ,总结一下,创建一个闭包必须满足以下几点:

    1. 必须有一个内嵌函数
    2. 内嵌函数必须引用外部函数中的变量
    3. 外部函数的返回值必须是内嵌函数
    # wai_fuc是外部函数,a和b都是外部函数的变量
    def wai_fuc(a):
        b = 10
        # nei_fuc是内部函数
        def nei_fuc():
            # 在这个内函数中,用到了外部函数的变量
            print(a + b)
        # 外函数的返回值是内函数的引用
        return nei_fuc
    
    if __name__ == '__main__':
    
        # 调用了外部函数,并传入变量,此时a=20,b=10.并创建了内部函数,然后又把内部函数的引用返回给了外部函数
        demo1 = wai_fuc(20)
        # demo1存了外函数的返回值(外函数的返回值是内函数的引用),这里相当于执行了内部函数
        demo1()  # 30
    
        demo2 = wai_fuc(30)
        demo2()  # 40

    外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数,因此外函数的结束并没有清空a,b的数值,而是绑定给了内函数。

    • 装饰器

  • 相关阅读:
    优化慢执行或慢查询的方法
    Top K问题的两种解决思路
    优先队列实现 大小根堆 解决top k 问题
    进程间的八种通信方式----共享内存是最快的 IPC 方式
    二叉树基础之按层打印
    按层打印二叉树--每行打印一层
    给定一颗完全二叉树,给每一层添加上next的指针,从左边指向右边
    缓存与数据库一致性保证
    一致性哈希算法原理
    Linux复制指定目录下的文件夹结构
  • 原文地址:https://www.cnblogs.com/blog-rui/p/10488047.html
Copyright © 2011-2022 走看看