深入浅出Python闭包与装饰器:原理与基础用法
你可曾有过好奇, , 那当中优雅的语法背后隐匿着怎样的逻辑要是你运用timer去装饰函数就能够自动进行运行时间统计, 借由便能轻而实施权限校验之际, 实际上都是闭包以及装饰器在悄然运作了这俩看起来抽象的概念, 正是代码简洁与灵活的秘密武器今儿个, 我们要从原理一直到实践, 一步步去揭开它们的面纱了。1. 闭包函数里的状态容器1.1 闭包的定义与形成条件闭包属于函数式编程里的核心特性, 归根结底是“嵌套函数、自由变量以及作用域延伸”组成的结合体。一旦内层的函数引用了处于外层函数作用范围里的变量, 并且外层函数将内层函数返回, 如此便形成了闭包。形成闭包必须满足三个条件代码示例最简单的闭包实现def ():# 外层函数变量自由变量info def ():# 内层函数引用外层自由变量print(f接收到消息{info})# 返回内层函数对象不执行10# 创建闭包实例固定自由变量info为Hello 11 (Hello )12# 调用闭包此时外层函数已执行完毕但info仍被保存13() # 输出接收到消息Hello1.2 闭包的工作原理自由变量的保鲜术闭包最为关键的神奇魔力主要在于能够延长自由变量的生命周期, 在正常状况情形下, 当函数执行完毕之后, 其内部所包含的变量会被进行垃圾回收操作, 然而闭包依靠属性, 把自由变量保存于特殊的cell对象里边, 致使内层函数就算脱离了外层函数的作用域范围, 依旧能够访问这些变量。代码示例探索闭包的内部状态def ():count 0 # 自由变量被闭包保存的计数器def ():count # 声明修改外层变量 3特性count 1count# 创建计数器闭包10 ()11print(()) # 输出112通过执行print(())这一操作, 其输出结果为2, 此结果表明count值处于被持续保存的状态。1314# 查看闭包保存的自由变量15print(.) # 输出(,)16进行print(..)操作, 其输出结果为2此数字是通过直接访问cell里的count值得出。1.3 闭包的实用场景简洁的状态管理解决“需要携带状态但不想用类”这一情景状况, 闭包最为擅长, 其常见应用涵盖以下方面:代码示例温度转换器工厂def r(unit):根据单位生成不同的温度转换函数def t(c):c * 1.8 32def (c):c 273.15# 根据外层参数返回不同的内层函数if unit :t10elif unit :111213# 创建不同转换器闭包实例14to_f r()15to_k r()1617打印, 将零进行转换为华氏度的操作之后的结果, 此结果为三十二点零, 也就是零摄氏度所对应的华氏度数值。18打印, 将零摄氏度转换为开尔文的结果, 输出为二百七十三点一五, 即print(to_k(0)) # 输出: 273.150℃转开尔文。2. 装饰器函数的增强插件2.1 装饰器的本质与语法糖闭包的典型应用之中有装饰器, 其本质是这样一种高阶函数, 即接受函数当作参数, 并且返回增强版函数, 借助装饰器名语法糖, 装饰器的使用得以简化, 进而让代码变得更加简洁。核心逻辑是, 等价于func (func), 这意味着, 要将被装饰函数替换成, 装饰器返回的新函数。代码示例无参装饰器基础实现def (func):打印函数调用日志的装饰器def ():print(f 函数 {func.} 开始执行)func() # 调用原函数print(f 函数 {func.} 执行完毕)# 使用语法糖应用装饰器1011def ():12print(Hello !)1314# 调用被装饰后的函数15()16# 输出17# 函数 开始执行18# Hello !19# 函数 执行完毕2.2 基础装饰器的实现步骤实现一个装饰器通常需要3步定义装饰函数接受被装饰函数func作为参数自定义一个用于包装的函数, 在这个函数里面进行对func的调用, 并且添加诸如日志记录、计时操作以及权限校验之类的增强逻辑。返回包装函数将作为结果返回替换原函数。代码示例计时装饰器带参数与返回值处理timedef (func):def (*args, **):包装函数支持任意参数和返回值 time.time()对原函数展开调用, 同时, 将其返回值予以捕获, 具体形式为 func(*args, **)。 time.time()你提供的内容存在错误信息并有缺失部分, 不太能准确按照要求改写。请你检查并修正完整准确的内容后再次提出。10# 返回原函数的结果11121314def (n):15计算1到n的和16sum(range(1, n1))1718# 调用被装饰的函数19print(()) # 输出20于此同时进行打印: 进行执行操作所耗费的时间为: 零点零零二三秒此时间会依据设备不同而有所变化。2.3 进阶技巧带参数的装饰器与装饰器链要是装饰器得自定义参数, 像日志级别、权限角色这类, 那就得用三层嵌套, 外层接收参数, 中层接收函数, 内层是包装函数。而且, 能把多个装饰器叠加一块用, 也就是装饰器链, 执行顺序是从下往上, 靠近函数的装饰器先运行。代码示例1带参数的日志装饰器def (level):带日志级别参数的装饰器三层嵌套def (func):def ():print(f{level.upper()}函数 {func.} 被调用)func()# 应用带参数的装饰器()10def ():11print(执行核心操作...)1213()14# 输出 函数 被调用15# 执行核心操作...代码示例2装饰器链的执行顺序def (func):def ():print(装饰器A开始)func()print(装饰器A结束)def (func):def ():10print(装饰器B开始)11func()12print(装饰器B结束)131415# 装饰器链从下到上执行先B后A161718def ():19print(目标函数执行)2021()22# 输出顺序23# 装饰器A开始24# 装饰器B开始25# 目标函数执行26# 装饰器B结束27# 装饰器A结束3. 总结闭包借助保存自由变量达成“函数带状态”, 这是装饰器的根基所在装饰器是基于闭包的, 它提供了函数增强的一种优雅方案。掌握这两者能够使你编写出更为简洁、极具模块化特点的代码, 无论是从数据封装方面, 还是到日志、缓存、权限控制等领域, 闭包与装饰器都是无处不在的。要记住: 闭包是“状态容器”, 装饰器是“函数插件”, 它们联袂构成函数式编程的核心魅力句号。4. 学习好书推荐能否曾经有过那种, 开始接触时觉得不难入门, 然而却一直处于在“能够看明白”以及“能够书写得好”这两者之间来回犹豫不决的情况呢? 到了现在此时此刻, 应当借助两本堪称经典的作品, 从而彻彻底底地将你的关键脉络給打通。一个不算枯燥语法手册的, 能通过一个个真实项目, 让你从简单数据可视化开始一直到开发小游戏, 在动手乐趣里自然掌握核心概念的心路指南介绍出适合新人告别看了就忘而向真正的理解拥抱前行的《编程从入门到实践》, 是你的完美起点。编程 从入门到实践 第3版图灵出品¥81.7京东月销量100好评率99%无理由退换京东配送购买当你筑牢根基, 《面向对象编程指南》会引领你步入高手之境。面向对象乃是创作出优雅且可复用代码的关键所在, 这本书以深入浅出之态揭示其核心要义。你能够学会怎样构筑更为强大的程序, 为日后投身复杂项目奠定坚实根基。面向对象编程指南(异步图书出品)¥62.3京东好评率99%无理由退换京东配送旗舰店购买这两本书构成了一个堪称完美的成长闭环, 此闭环是从毫无基础起始, 直至成为专业开发者的过程。不管你是身为殷切渴望实现转行的职场之人, 又或者是满心期望提升自身竞争力的在校学生, 这一套组合都能够使你规避步入需耽搁半年时间的偏离正轨之路。

相关新闻

Python之函数高级:一篇文章彻底搞懂什么是“闭包”

Python之函数高级:一篇文章彻底搞懂什么是“闭包”

引言在编程中,有一个让一些新手望而却步的概念——“闭包()”。一方面, 闭包的定义以及作用机制着实略微有那么点复杂, 另一方面, 这个概念好像更倾向于数学、理论的范畴, 对于新手而言, 好像并没有太多的应用场景。不管怎样, 因由前面已阐述…

2026/8/5 0:07:45 阅读更多 →
如何通过Sunshine自托管游戏串流服务器实现跨平台游戏体验

如何通过Sunshine自托管游戏串流服务器实现跨平台游戏体验

如何通过Sunshine自托管游戏串流服务器实现跨平台游戏体验 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾想过将高性能PC上的游戏无缝串流到平板、手机或客厅电视上&…

2026/8/5 0:07:45 阅读更多 →
当围棋遇见AI:我与LizzieYzy的七天探索之旅

当围棋遇见AI:我与LizzieYzy的七天探索之旅

当围棋遇见AI:我与LizzieYzy的七天探索之旅 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy "围棋不是关于赢棋的游戏,而是关于理解的艺术。"——但理解从何而来&am…

2026/8/5 0:07:45 阅读更多 →

最新新闻

10分钟掌握XUnity Auto Translator:Unity游戏翻译插件完全指南

10分钟掌握XUnity Auto Translator:Unity游戏翻译插件完全指南

10分钟掌握XUnity Auto Translator:Unity游戏翻译插件完全指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍而错过精彩的Unity游戏?XUnity Auto Translator是…

2026/8/5 0:47:19 阅读更多 →
计算机毕业设计之电影购票app设计与实现

计算机毕业设计之电影购票app设计与实现

随着互联网的趋势的到来,各行各业都在考虑利用互联网将自己的信息推广出去,最好方式就是建立自己的平台信息,并对其进行管理,随着现在智能手机的普及,人们对于智能手机里面的应用电影购票app也在不断的使用&#xff0c…

2026/8/5 0:47:19 阅读更多 →
RAG 效果差,八成不是模型不行

RAG 效果差,八成不是模型不行

导语 RAG 一上线,最常见抱怨是: “模型不行,答非所问。” 别急着换更贵的模型。 很多时候,模型只是在认真使用你检索给它的垃圾上下文。 输入是混的,输出很难清。 今天这篇只讲一个观点: RAG 效果差…

2026/8/5 0:47:18 阅读更多 →
如何快速掌握NVIDIA显卡优化:免费专业级NVIDIA Profile Inspector终极配置指南

如何快速掌握NVIDIA显卡优化:免费专业级NVIDIA Profile Inspector终极配置指南

如何快速掌握NVIDIA显卡优化:免费专业级NVIDIA Profile Inspector终极配置指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 还在为游戏帧率不稳定而烦恼吗?想免费解锁NVIDIA显…

2026/8/5 0:45:18 阅读更多 →
从0到1搞懂“钱包“:私钥、助记词、地址,到底是什么关系?一篇讲透

从0到1搞懂“钱包“:私钥、助记词、地址,到底是什么关系?一篇讲透

你猜怎么着? 90% 的人第一次买币,都栽在同一个坑上:把币存在交易所里,以为那就是自己的钱包。 结果平台一跑路、一冻结,你账户里的数字瞬间归零,哭都来不及。说白了,你根本没拥有过那些币&#…

2026/8/5 0:44:17 阅读更多 →
AI写企鹅号内容效率提升300%:20年资深运营亲测的7步标准化工作流

AI写企鹅号内容效率提升300%:20年资深运营亲测的7步标准化工作流

更多请点击: https://codechina.net 第一章:AI写企鹅号内容效率提升300%:20年资深运营亲测的7步标准化工作流 在企鹅号内容运营实践中,传统人工撰写单篇图文平均耗时45分钟,而采用本章所述标准化工作流后,…

2026/8/5 0:43:16 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →