深入浅出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/10/2 14:06:37 阅读更多 →
如何通过Sunshine自托管游戏串流服务器实现跨平台游戏体验

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

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

2026/9/26 0:12:41 阅读更多 →
当围棋遇见AI:我与LizzieYzy的七天探索之旅

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

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

2026/9/28 11:12:35 阅读更多 →

最新新闻

燃烧仿真中辐射传热模型怎么选?DO与WSGGM实战指南

燃烧仿真中辐射传热模型怎么选?DO与WSGGM实战指南

1. 辐射传热:燃烧仿真中最容易忽略的主角做燃烧仿真的人都知道一个矛盾:大多数人入门的第一个燃烧算例,火焰温度总是偏高。不管湍流模型怎么调、化学反应机理怎么换,炉膛出口温度就是压不下来。直到某天某位前辈淡淡说了一句“你开…

2026/10/14 4:27:51 阅读更多 →
GridView AJAX化实战:告别Postback,实现无刷新分页与排序

GridView AJAX化实战:告别Postback,实现无刷新分页与排序

简介:面向ASP.NET开发者的GridView实用示例包,针对VS自带的GridView在数据增删改操作上不灵活、页面刷新频繁、交互体验差等痛点,提供了一套基于ASP.NET 4.0与SQL Server 2008的轻量级解决方案,通过Ajax实现无刷新操作&#xff0c…

2026/10/14 4:27:51 阅读更多 →
什么情况下索引会失效

什么情况下索引会失效

一、什么叫做索引失效索引失效,是指查询时因为写法或条件的问题,数据库用不上(或只用上一部分)已有的索引,导致加速能力丧失,退化成全表扫描或逐行过滤。数据照样查得出来,结果也对,…

2026/10/14 4:27:51 阅读更多 →
数据中心废热回收:从能源黑洞到热源工厂的工程实践

数据中心废热回收:从能源黑洞到热源工厂的工程实践

数据中心在多数人的第一印象里就是“电老虎”“能源黑洞”,这个印象不算错,但往往忽略了一件关键的事:电力穿过服务器之后,并没有真的消失,而是变成了热量。只是这些热量通常被冷却塔、风机和冷冻水系统当作废料排进大…

2026/10/14 4:27:51 阅读更多 →
2025年12月六级真题三套全解析:考点拆解与复盘方法

2025年12月六级真题三套全解析:考点拆解与复盘方法

2025年12月的大学英语六级考试一结束,我就开始整理这一批真题。原因很简单:备考群里连续好几天都有人在问卷子做得对不对、作文跑没跑题、三套卷到底该先做哪套。我把三套题目重新过了一遍,也把答案解析重新盘了一遍,这篇就从这套…

2026/10/14 4:27:51 阅读更多 →
AnyPS5跨平台图像处理管线:色彩管理与批量处理实战避坑指南

AnyPS5跨平台图像处理管线:色彩管理与批量处理实战避坑指南

1. 项目缘起与核心定位AnyPS5 这个名字第一次出现在我视野里的时候,我正被一堆跨平台图像处理的需求折腾得够呛。团队里有人用 Windows 做设计,有人用 macOS 做后期,还有几个同事习惯在 Linux 环境下跑批处理脚本,每次交付素材都要…

2026/10/14 4:26:51 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →