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的数值,而是绑定给了内函数。

    • 装饰器

  • 相关阅读:
    进程笔记(一)
    Docker(二) 镜像
    Docker(一) 简介
    Nginx(二) 常用配置
    4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块
    3、ABPZero系列教程之拼多多卖家工具 项目修改及优化
    2、ABPZero系列教程之拼多多卖家工具 更改数据库为Mysql
    1、ABPZero系列教程之拼多多卖家工具 前言
    asp.net mvc 记录Action耗时
    [转]C#异步的世界【上】
  • 原文地址:https://www.cnblogs.com/blog-rui/p/10488047.html
Copyright © 2011-2022 走看看