首页 > 编程语言 >Python 闭包

Python 闭包

时间:2022-12-14 17:13:37浏览次数:49  
标签:闭包 函数 Python filename inner outter name

闭包概念

闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。

def outter():
    name = "test"
    def inner():
        print("from inner,name is%s" % name)
        return "inner函数"
    return inner
a = outter()
print(a.__name__)
print(a())

----------------
运行结果如下
inner
from inner,name istest
inner函数

以上就是个闭包函数的典型示例,有如下特征:

  1. 一个外部函数outter内部会包裹多个inner子函数,因为函数的作用域关系,对inner函数而言,outer函数的name相对来说就是全局变量,
  2. inner 函数结束后 必须有个return inner 进行函数返回
    outter的返回值指示inner函数的内存地址

闭包应用场景

闭包的实际应用场景更多在于异步调用(协程和多线程的异步).因为异步调用,函数每次执行完成需要的时间不同,有些变量无法从全局传入.最好的方式就是讲参数执行的时候就传入闭包中,因为作用域的关系.
局部变量彼此之间不会相互影响.

上面例子中 add_done_callback方法会再线程池调用完down函数以后,继续调用done函数,但是此时只能传入一个arg参数,里面的arg.result()就是前面down函数的返回值.
此时无法传入filename参数,也无法设置全局变量,因为我们要实现保存的文件名是不同的.

解决办法

办法1: 我们把filename这个参数也写入down的返回值中

办法2: 就是使用闭包函数,将filename参数传入闭包outter函数,在其outter内部作为全局变量,就可以将闭包体内将filename传入.
而且outter函数运行的时候会单独创建一个独立的内存栈.多线程并发运行的三个outter函数是作用与不同的内存地址的.所以他们内部的局部变量也是各自独立.

标签:闭包,函数,Python,filename,inner,outter,name
From: https://www.cnblogs.com/Young-shi/p/16982669.html

相关文章

  • python json使用
    本质:字典和json字符串相互转换json.dumps将一个Python数据结构转换为JSONimportjsondata={'name':'myname','age':100,}json_str=json.dumps(d......
  • python学习笔记整理02(判断、循环)
    程序开发中有三大流程:顺序、分支、循环 一、顺序:代码从上到下,依次执行 二、分支:判断语句,代码有选择的执行if判断条件1:书写条件1成立(真),执行的代码#判断条......
  • Python用telnet设置,抓UDP抓采样点并显示
    ====main.bat====echooffrem"d:\Program\WiresharkPortable64\App\Wireshark\tshark.exe"--list-interfacesrem"d:\Program\WiresharkPortable64\App\Wireshark\tsha......
  • python学习笔记整理01(变量、数据类型、容器、输入和输出、运算符)
    一、变量二、数据类型三、容器1介绍2字符串3列表4元组5字典6容器的通用方法四、输入和输出五、运算符 一、变量1.介绍①含......
  • Python3 编程面试题
    Pythonglobal语句的作用lambda匿名函数好处Python错误处理Python内置错误类型简述any()和all()方法Python中什么元素为假?提高Python运行效率的方法Pyt......
  • cloudpickle —— Python分布式序列化的专用模块
    给出cloudpickle的GitHub地址:https://github.com/cloudpipe/cloudpickle    ======================================================= ......
  • .val() python
    val()函数的功能为:将一组字符型数据的数字部分转换成相应的数值型数据val()函数当识别到非数字,停止读入字符串。例1x="7855fdsaDAsdf6";输出就是7855将字符......
  • python第三方库
    第三方库网址:​​https://pypi.org/​​cmd:./python.exe-mpipinstall(...)-i镜像临时使用镜像源:清华:https://pypi.tuna.tsinghua.edu.cn/simple阿里云:http://mirrors.......
  • 巨蟒python全栈开发数据库前端5:JavaScript1
     1.js介绍&变量&基础数据类型2.类型查询&运算符&if判断&for循环3.while循环&三元运算符4.函数5.今日总结 1.js介绍&变量&基础数据类型js介绍(1)什么是JavaScript&一些历史......
  • python链接数据库
    一、链接数据库#sql1.pyimportpymysql#user=input('用户名:').strip()#pwd=input('密码:').strip()#链接#conn=pymysql.connect(host='192.168.8.129',user=......