位置: 编程技术 - 正文

简析Python的闭包和装饰器(python中闭包的作用)

编辑:rootadmin

推荐整理分享简析Python的闭包和装饰器(python中闭包的作用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python闭包的定义,python3 闭包,python中闭包的作用,python 闭包的作用,python中闭包的作用,python 闭包的作用,python3 闭包,python 闭包的作用,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是装饰器?装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直接看示意图,其中 a 为与装饰器 @a 对应的函数, b 为装饰器修饰的函数,装饰器@a的作用是:

简而言之:@a 就是将 b 传递给 a(),并返回新的 b = a(b)

栗子:

上面使用@dobi来表示装饰器,其等同于:qinfeng = dobi(qinfeng) 因此装饰器本质上就是个语法糖,其作用为简化代码,以提高代码可读性,运行上段代码的结果为:

解析过程是这样子的:1.python 解释器发现@dobi,就去调用与其对应的函数( dobi 函数)2.dobi 函数调用前要指定一个参数,传入的就是@dobi下面修饰的函数,也就是 qinfeng()3.dobi() 函数执行,调用 qinfeng(),qinfeng() 打印“dobi”

什么是闭包?首先还得从基本概念说起,什么是闭包呢?来看下维基上的解释:在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。....上面提到了两个关键的地方: 自由变量 和 函数, 这两个关键稍后再说。还是得在赘述下“闭包”的意思,望文知意,可以形象的把它理解为一个封闭的包裹,这个包裹就是一个函数,当然还有函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以在随着包裹到处游荡。当然还得有个前提,这个包裹是被创建出来的。在通过Python的语言介绍一下,一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量。举个栗子:

这里面调用func的时候就产生了一个闭包——inner_func,并且该闭包持有自由变量——name,因此这也意味着,当函数func的生命周期结束之后,name这个变量依然存在,因为它被闭包引用了,所以不会被回收。

另外再说一点,闭包并不是Python中特有的概念,所有把函数做为一等公民的语言均有闭包的概念。不过像Java这样以class为一等公民的语言中也可以使用闭包,只是它得用类或接口来实现。

nonlocal 语句在 python 的函数内,可以直接引用外部变量,但不能改写外部变量,因此如果在闭包中直接改写父函数的变量,就会发生错误:

简析Python的闭包和装饰器(python中闭包的作用)

在 python 2 中可以在函数内使用 global 语句,但全局变量在任何语言中都不被提倡,因为它很难控制,python 3 中引入了 nonlocal 语句解决了这个问题:

Nonlocal 与 global 的区别在于 nonlocal 语句会去搜寻本地变量与全局变量之间的变量,其会优先寻找层级关系与闭包作用域最近的外部变量。

闭包与装饰器上面已经简单演示了装饰器的功能,事实上,装饰器就是一种的闭包的应用,只不过其传递的是函数:

@makeitalic 装饰器将函数 hello 传递给函数 makeitalic,函数 makeitalic 执行完毕后返回被包装后的 hello 函数,而这个过程其实就是通过闭包实现的。@makebold 也是如此,只不过其传递的是 @makeitalic 装饰过的 hello 函数,因此最后的执行结果 <b> 在 <i> 外层,这个功能如果不用装饰器,其实就是显式的使用闭包:

闭包的作用闭包的最大特点是可以将父函数的变量与内部函数绑定,并返回绑定变量后的函数(也即闭包),此时即便生成闭包的环境(父函数)已经释放,闭包仍然存在,这个过程很像类(父函数)生成实例(闭包),不同的是父函数只在调用时执行,执行完毕后其环境就会释放,而类则在文件执行时创建,一般程序执行完毕后作用域才释放,因此对一些需要重用的功能且不足以定义为类的行为,使用闭包会比使用类占用更少的资源,且更轻巧灵活,现举一例:假设我们仅仅想打印出各类动物的叫声,分别以类和闭包来实现:

可以看到输出结果是完全一样的,但显然类的实现相对繁琐,且这里只是想输出一下动物的叫声,定义一个 Animal 类未免小题大做,而且 voice 函数在执行完毕后,其作用域就已经释放,但 Animal 类及其实例 dog 的相应属性却一直贮存在内存中:

而这种占用对于实现该功能后,则是没有必要的。

除此之外,闭包还有很多其他功能,比如用于封装等,另外,闭包有效的减少了函数参数的数目,这对并行计算非常有价值,比如可以让每台电脑负责一个函数,然后串起来,实现流水化的作业等。

Python 的描述符 descriptor详解 Python在2.2版本中引入了descriptor(描述符)功能,也正是基于这个功能实现了新式类(new-styelclass)的对象模型,同时解决了之前版本中经典类(classicclass)系

Python 多线程抓取图片效率对比 目的:是学习python多线程的工作原理,及通过抓取张图片这种IO密集型应用来查看多线程效率对比importrequestsimporturlparseimportosimporttimeimportthreadingimportQueu

如何在Python中编写并发程序 GIL在Python中,由于历史原因(GIL),使得Python中多线程的效果非常不理想.GIL使得任何时刻Python只能利用一个CPU核,并且它的调度算法简单粗暴:多线程中,让每个

标签: python中闭包的作用

本文链接地址:https://www.jiuchutong.com/biancheng/383332.html 转载请保留说明!

上一篇:Android应用开发中Action bar编写的入门教程(android应用开发基础课后答案)

下一篇:Python 的描述符 descriptor详解(python文件描述符)

  • 税务迁移麻烦吗
  • 劳务报酬个人所得税税率表
  • 分税制财政管理体制是什么?
  • 开票和预缴税款跨月
  • 文化创意服务的税率
  • 计提坏账所得税费用分录
  • 计提应收的增值税返还
  • 企业构建固定资产支付的现金应列示在现金流量表
  • 做账时计提费用不含税怎么取整
  • 土地转让缴纳增值税政策
  • 高速公路通行费发票可以抵扣增值税吗
  • 小规模纳税人销售不动产适用税率
  • 预付的固定资产没有收到发票怎么入账
  • 个人投资借款长期不还要缴纳个人所得税吗?
  • 未足额代扣代缴车船税
  • 往年的企业所得税季报可以更正吗
  • 非公司私营企业属于什么类型
  • 0税率发票纳税申报如何填报
  • 营改增后的税率
  • 企业筹建期间开办费计入什么科目计入借方还是贷方
  • 资产处置损益借贷方向表示什么
  • windows右键刷新总是卡住
  • php字符串型数据的定义方式
  • php字符串函数大全
  • 公司账户转账到出纳个人账户
  • macbook直接显示桌面
  • 罚款收入营业外收入还是其他应收款
  • php基本操作
  • php二维数组求和
  • 阿里云phpstudy
  • 小微企业免税额的会计分录
  • 对公贷款利息支付
  • vue实战开发项目视频
  • echarts柱状图立体
  • 卷积神经网络有哪些
  • python中sys模块
  • 网上购物没有发票怎么保修
  • 投标保证金的缴纳方式有哪些
  • 质量扣款应收账款怎么算
  • 发票没拿回来可以报销吗
  • 租房合同违约金200%合理吗
  • 电子发票和纸质发票的优缺点
  • asp.net mvc图片上传
  • 资本化费用为什么会减少
  • 销售代销货物会计处理
  • 律师事务所收取费用有标准吗
  • 待摊费用如何做账 税金怎么处理
  • 应收票据周转率公式
  • 设备租赁公司怎么样
  • 收到总公司拨款怎么入账
  • 招待费具体范围包括哪些
  • 营改增后物业公司账务处理
  • 预付押金是否可以退回
  • 物流到付如何做账务处理
  • 广告制作费属于现代服务吗
  • 现金日记账怎么划线
  • mysql 5.7.18 zip版安装配置方法图文教程(win7)
  • linux系统中cron命令
  • centos 安装
  • win7 64位系统如何查看计算机名称为了应付某一操作
  • 怎么提高windows7性能
  • win7系统的文件夹怎么挪位置
  • win7系统不兼容开不了机
  • Win10 Mobile RS1预览版14267.1004 修复Lumia 550充电问题
  • jQuery+Ajax实现无刷新分页
  • JavaScript中的数据类型分哪为两大类?
  • css标准规范
  • 深入理解中国式现代化
  • node.js ts
  • shell命令for
  • android基础知识大全
  • 留抵税额如何抵扣
  • 研发费用加计扣除2022政策
  • 税务意识形态工作主要内容有哪些
  • 江苏省国税局客服电话
  • 国家级运动员怎么申请
  • 广东省哪里地方考中控证好
  • 申请农合减免
  • 放管服中的服的深层含义
  • 耗电异常优化是什么意思微信
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设