尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python第三十讲:闭包Closure精讲,铺垫装饰器基础

Python第三十讲:闭包Closure精讲,铺垫装饰器基础 上一节, 我们学习完了变量作用域, 以及关键字, 掌握了嵌套函数修改变量的办法。本节课, 解锁函数式编程核心知识点, 也就是闭包, 它是装饰器的前置基础, 日常用于做计数、参数固化、简易数据封存都很不错, 也是面试高频考点, 零基础的话跟着案例一步步去理解就行。一、闭包是什么先记3个必备条件闭包属于嵌套函数的一种特殊形态, 简单来说, 当外层函数运行告一段便后, 内层函数仍然能够记住并且调用外层函数所定义的变量, 甚而外围函数已然执行完毕进而退出。想要构成合法闭包必须同时满足3点1. 存在嵌套结构外层函数内部定义内层函数2. 外层函数之中存在局部变量, 并非全局变量, 而内层函数会对其进行引用, 此局部变量也就是自由变量。3. 外层函数把内层函数本身作为返回值传出常规嵌套对比非闭包普通嵌套只在外层内部调用内层不返回内层不算闭包def outer():num 10def inner():print(num)inner()outer()那局部变量 num , 在外层执行完之后, 马上就被销毁掉, 而外部, 是没有办法去调用 inner 的, 所以, 很明显它是不满足闭包条件。二、最简闭包示例直观感受特性基础写法def outer(num):# 外层自由变量def inner():print(f获取外层数值{num})# 返回内层函数不加括号返回函数对象而非执行结果inner# 接收返回的内层函数outer执行完毕结束运行func outer(28)# 外层早已结束内层依旧能读取外层变量闭包生效func()运行结果获取外层数值28核心亮点在于, outer(28) 执行完毕, 本应被销毁的局部变量, 因闭包保留了变量环境, 使得 inner 能够持续进行访问。多次调用独立封存数据每次调用外层函数会生成一组独立的变量环境互不干扰def outer(num):def inner():print(num)innerf1 outer(5)f2 outer(99)f1()f2()输出99两套独立环境数据隔离不用定义全局变量就能存状态。三、闭包修改变量搭配使用要是打算于内层之中对外层自由变量予以修改, 继续采用前边学到的关键字就行, 适宜作为累加计数的那种场景。def ():cnt 0def ():cntcnt 1print(f当前计数{cnt}) ()()()()运行结果当前计数1当前计数2当前计数3优势点在于, 计数变量 cnt 是通过闭包予以封存的, 在全局区域是没法访问到的, 如此便能避免全局变量被任意地篡改, 达成简易形式的数据隐藏。四、闭包常见实用场景场景1固定基础参数简化重复调用比如统一设置税率多次计算不同商品税后价格def (rate):def calc(price):price * (1 rate)calc# 创建增值税13%计算器tax13 (0.13)print(tax13(100))print(tax13(200))不用每次重复传入税率参数提前固化代码更简洁。场景2小型状态计数器前面那些累加起来的案例堪称典型, 用来做访问次数的统计, 进行打卡计数尤为便利, 相较于全局变量显得更为安全。场景3装饰器前置铺垫接下去要学习的装饰器, 其本质实际上是闭包的进一步应用, 闭包起着保留原函数对象、拓展功能的作用, 当下要是把原理彻底弄明白, 那么下一节入门装饰器的时候就会轻松许多。五、新手易错避坑总结1. 返回函数别加括号单独的“inner”正确, 当出现“inner()”时, 它会直接去执行内层部分, 并且返回执行出来的结果, 然而却没办法形成闭包。2. 修改外层变量必须用仅仅读取外层的变量, 却不使用关键字, 在进行赋值修改的时候, 不加以添加, 这样的情况下, 就会创建出内层的局部变量, 进而导致闭包失去作用。3. 不要滥用闭包先是简单逻辑为优先于普通函数的存在待到有长期留存少量状态、隔离数据的需求之时, 才运用闭包复杂状态管理则将优先采用面向对象类的写法, 如此这般。4. 自由变量常驻内存闭包会持续持有外层变量不用时及时释放引用减少内存占用。六、课堂综合练习依据要求撰, 闭包来达成, 折扣计价这一操作, 外层将固定折扣予以传入, 内层把原价接收, 进而输出其折后价。参考代码def ():def ():*# 8折计价工具sale8 (0.8)print(sale8(200))本节要点复盘1. 存在闭包的三个要素, 其一为嵌套函数, 其二是内层引用外层的变量, 其三是外层返回内层函数对象。2. 核心优势在于, 外层函数结束之时, 内层会保留变量所处的环境, 将状态予以封存, 把数据进行隔离, 以此来替代全局变量。3. 修改变量搭配 返回函数禁止添加执行括号4. 常用场景计数、固定参数工具、装饰器底层基础
返回列表