位置: 编程技术 - 正文

Python的几个高级语法概念浅析(lambda表达式闭包装饰器)(python高级写法)

编辑:rootadmin

推荐整理分享Python的几个高级语法概念浅析(lambda表达式闭包装饰器)(python高级写法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python类的高级用法,python的级别,python类的高级用法,python高级写法,python高级语言,python高级语言,python高级语言,python类的高级用法,内容如对您有帮助,希望把文章链接给更多的朋友!

1. 匿名函数匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programming languages领域,典型应用场合:1) 作为参数传给高阶函数(higher-order function ),如python中的built-in函数filter/map/reduce都是典型的高阶函数2) 作为高阶函数的返回值(虽然此处的"值"实际上是个函数对象)与命名函数(named function)相比,若函数只被调用1次或有限次,则匿名函数在语法上更轻量级。具体语法上,python通过lambda语法支持函数体为表达式的匿名函数,即:python的lambda表达式本质上是个匿名函数,但其函数体只能是个表达式,不能包含其它语句。此外,高级动态语言常借助匿名函数实现闭包(closure)或装饰器(decorator)等高级语法。在一些场合下,lambda表达式的使用使得python程序看起来非常简洁。例如,下面是根据value对dict元素做排序的代码示例:

2. 闭包闭包(closure)本质上是一个包含了其引用环境(referencing environment)的函数或函数引用,这里的"引用环境"通常由一张表来维护,该表存储了函数体会访问的非局部变量(non-local variables)的引用。与C语言中的函数指针相比,闭包允许嵌套函数访问其作用域外的non-local变量,这与Python解释器对变量的作用域查找规则有关(Python支持LEGB的查找规则,想深究的话,可以参考<Learning Python>第4版第章Scopes关于作用域及查找规则的详细讲解,或者查看这篇文章 做快速了解)。对于运行时内存分配模型会在线性栈上创建局部变量的语言来说(典型如C语言),通常很难支持闭包。因为这些语言底层实现中,若函数返回,则函数中定义的局部变量均会随着函数栈被回收而销毁。但闭包在底层实现上要求其要访问的non-local变量在闭包被执行的时候保持有效,直到这个闭包的生命周期结束,这意外着这些non-local变量只有在其确定不再被使用时才能销毁,而不能随着定义这些变量的函数返回销毁。因此,天生支持闭包的语言通常采用garbage collection的方式管理内存,因为gc机制保证了变量只有不再被引用时才会由系统销毁并回收其内存空间。具体语法上,闭包通常伴随着函数嵌套定义。以Python为例,一个简单的闭包示例如下:

执行结果如下:

Python的几个高级语法概念浅析(lambda表达式闭包装饰器)(python高级写法)

上述示例中,startAt_v1和startAt_v2均实现了闭包,其中:v1借助嵌套定义函数实现;v2则借助lambda表达式/匿名函数来实现。我们以v1为例对闭包做说明:1) 函数startAt_v1接受1个参数,返回1个函数对象,而这个函数对象的行为由嵌套定义的函数incrementBy实现。2) 对函数incrementBy来说,变量x就是所谓的non-local变量(因为x既非该函数定义的局部变量,又非普通意义上的全局变量),incrementBy实现具体的函数行为并返回。3) main入口的c1接收到的返回值是个函数对象,从id(incrementBy) == id(c1)可断定,c1"指向"的对象与函数名incrementBy"指向"的其实是同一个函数对象。4) 受益于Python对闭包的支持,与普通函数的对象相比,c1指向的对象可以访问不在其函数作用域内的non-local变量,而这个变量是由incrementBy的外层包装函数startAt_v1的入参提供的,于是,相当于c1指向的函数对象对其外层包装函数的入参具有"记忆"功能,通过调用外层包装函数创建闭包时,不同的入参被内层函数作为引用环境维护起来。5) 调用c1(3)时,传入的参数与引用环境维护的外层包装函数的参数一起运算得到最终结果。以上步骤分析说明了一个闭包从创建到执行的基本原理,理解这个case后,闭包的概念也应该清晰了。

3. 装饰器python支持装饰器(decorator)语法。装饰器的概念对于初学者来说比较晦涩,因为它涉及到函数式编程的几个概念(如匿名函数、闭包),这也是本文先介绍匿名函数和闭包的原因。

我们引用这篇文章对装饰器的定义:A decorator is a function that takes a function object as an argument, and returns a function object as a return value.从这个定义可知,装饰器本质上只是一个函数,它借助闭包的语法去修改一个函数(又称被装饰函数)的行为,即decorator其实是个闭包函数,该函数以被装饰函数名(这个函数名其实是一个函数对象的引用)作为入参,在闭包内修改被装饰函数的行为后,返回一个新的函数对象。特别说明:decorator并非必须以函数形式出现,它可以是任何可被调用的对象,例如它也可以class形式出现,参见这篇文章给出的例子。在定义好函数装饰器的前提下,当外部调用这个被装饰函数时,decorator的语法糖会由Python解释器解释为先执行装饰器函数,然后在装饰器返回的新函数对象上继续执行其余语句。来个实例分析一下:

上面的示例中,foo通过@wrapper语法糖声明它的装饰器是wrapper,在wrapper中,定义了嵌套的inner函数(该函数的参数列表必须与被装饰函数foo的参数列表保持一致),装饰器wrapper修改foo的行为后,返回inner(注意:由于inner的返回值是个int对象,故wrpper最终返回的也是个int对象)。调用foo(2, 3)时,Python解释器先调用wrapper对foo做行为改写,然后返回int对象,不难推测,上述代码的执行结果如下:

深入浅析python继承问题 有如下的代码:classp1:def__init__(self,a,b):print("initinp1")self.a1=aself.b1=bself.f1()deff1(self):print("f1inp1")classc1(p1):def__init__(self,a,b,c=2):print("initinc1")p1.__init__(self,a,b)se

整理Python 常用string函数(收藏) 字符串中字符大小写的变换1.str.lower()//小写'SkatE'.lower()'skate'2.str.upper()//大写'SkatE'.upper()'SKATE'3.str.swapcase()//大小写互换'SkatE'.swapcase()'sKATe'4.str.title()//首

Python 常用string函数详解 字符串中字符大小写的变换1.str.lower()//小写'SkatE'.lower()'skate'2.str.upper()//大写'SkatE'.upper()'SKATE'3.str.swapcase()//大小写互换'SkatE'.swapcase()'sKATe'4.str.title()//首

标签: python高级写法

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

上一篇:python自动翻译实现方法(python自动翻译小工具)

下一篇:深入浅析python继承问题(python继承的主要目的)

  • 退税收入如何做账
  • 递延所得税资产会计处理全过程
  • 增值税应纳税额的计算
  • 清算组的性质
  • 不确认销售收入结转销售成本
  • 哪些费用可在缴纳医保
  • 免税收入不征税收入有哪些
  • 汇算清缴时房企毛利额有差异如何调整
  • 可转债会计分录利息
  • 制药企业税收优惠政策
  • 员工交通费补贴标准
  • 小规模纳税人每季度超过30万交税
  • 工程的管理费收入怎么算
  • 大病医疗保险能税前扣除吗
  • 一般纳税人计提水利基金会计分录
  • 商业银行的下列哪些行为违反了法律规定?给存款大户
  • 预支备用金填请款单还是借支单
  • 往年预付账款错了,应如何调?
  • 刷信用卡付货款怎么操作
  • 经营性固定资产计入什么科目
  • 新会计准则要求
  • 购买银行理财产品被骗怎么办
  • 税金是否可以不计提呢?
  • 所得税汇算后要做账吗
  • 车辆租赁费可以开专票吗
  • 开具红字专用发票的情形
  • 仲裁委判决还能上诉吗
  • 哪些工资薪酬可以进行税前扣除?
  • 增值税小规模纳税人优惠政策
  • 带息商业汇票的利息分录?
  • 剑灵配置要求2020官方
  • 若依框架入门
  • 清算中无法偿还的债务
  • 购入的车辆入账包括哪些费用
  • 第三方检测公司招聘信息
  • mysqld-nt.exe - mysqld-nt是什么进程 有什么用
  • PHP:pg_lo_open()的用法_PostgreSQL函数
  • 家具折旧费是什么意思
  • vue word editor
  • 企业支付给员工的一次性伤残就业补助金计入什么科目
  • php比较大小
  • 矿产资源补偿费计入管理费用吗
  • 中国烟草资产负债表
  • 增值税收范围
  • ps中如何使用切片工具
  • python requests检测响应状态码
  • 未按期兑现的合同缴纳印花税吗?
  • 小规模公司累计增值税
  • 公司收到生育津贴不给员工
  • 股东权益合计是净资产吗
  • 从内地到香港坐飞机到国内
  • 应收账款未收到是否要交税
  • 已确认收入但尚未发出商品分录
  • 工会经费购买的固定资产处置
  • 发出存货的计价方法一经确定,不得随意改变
  • 进口关税税款的计税依据
  • 收到个人支付的培训费可以开对公的发票吗
  • 外贸整个流程图
  • 原始凭证错误的更正方法
  • 短期投资怎么记账
  • sql获取某个字符的位置
  • 服务主机windows错误报告
  • 添加网络打印机找不到设备
  • win8无法识别的usb设备 怎么解决
  • win8.1操作系统关闭驱动数字签名
  • win10预览版好吗
  • linux的awk命令大全
  • Linux系统安全配置包括
  • fsav32.exe是什么进程 有什么作用 fsav32进程查询
  • msmpeng.exe是什么进程
  • linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)
  • 快速解决胃胀气
  • unity热更新一般更新什么
  • nodejs npm install全局安装和本地安装的区别
  • python xml文件转化为excel
  • 使用vue-cli快速搭建vue项目
  • js如何使用
  • python如何获取
  • 车辆购置税查询不到
  • 河南林州在哪三省交界处
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设