当前位置: 首页 > news >正文

Python 闭包与装饰器 超详细精讲

一、前言:为什么要学闭包和装饰器?

闭包是函数高级用法,装饰器是Python 最优雅的语法糖
学会它们,你能写出:

  • 更简洁的代码
  • 不修改原函数就能增加功能
  • 日志、计时、权限、缓存等通用功能
  • 符合企业级开发规范的代码

闭包是基础,装饰器是闭包的经典应用。


二、什么是闭包(Closure)?

1. 闭包定义(最通俗)

  1. 函数里面定义了内部函数
  2. 内部函数使用了外部函数的变量
  3. 外部函数返回内部函数名
    满足这 3 点 = 闭包

2. 闭包三要素(必须背会)

  • 外部函数嵌套内部函数
  • 内部函数使用外部函数的变量
  • 外部函数返回内部函数

3. 最简单闭包代码

# 外部函数
def outer(x):# 外部函数变量a = x# 内部函数(闭包核心)def inner():# 使用外部函数变量return a + 10# 返回内部函数return inner# 创建闭包实例
func = outer(5)
# 调用内部函数
print(func())  # 15

4. 闭包特点

  • 内部函数可以记住外部函数的环境
  • 外部函数执行完毕,变量不会被销毁
  • 可以实现数据隐藏函数工厂

三、闭包经典案例:计数器

def counter():count = 0  # 外部变量def add():nonlocal count  # 声明修改外部变量count += 1return countreturn add# 创建计数器
c = counter()
print(c())  # 1
print(c())  # 2
print(c())  # 3

✅ 闭包让 count 变量一直保存在内存中


四、什么是装饰器(Decorator)?

1. 装饰器定义

  • 在不修改原函数代码的前提下,给函数增加新功能
  • 本质是闭包 + 语法糖 @
  • 装饰器 = 闭包的实际应用

2. 装饰器作用

  • 日志记录
  • 执行时间统计
  • 权限验证
  • 缓存
  • 参数检查

3. 装饰器语法

@装饰器名字
def 原函数():pass

五、最简单装饰器(一步步写)

第1步:写装饰器(闭包)

# 装饰器函数
def my_decorator(func):def wrapper():print("函数执行前 —— 新增功能")func()  # 调用原函数print("函数执行后 —— 新增功能")return wrapper

第2步:写原函数

def say_hello():print("Hello World")

第3步:使用装饰器

# 装饰
say_hello = my_decorator(say_hello)
# 调用
say_hello()

运行结果

函数执行前 —— 新增功能
Hello World
函数执行后 —— 新增功能

六、语法糖 @ 写法(最常用)

def my_decorator(func):def wrapper():print("函数执行前")func()print("函数执行后")return wrapper# 使用 @ 语法糖
@my_decorator
def say_hello():print("Hello World")say_hello()

✅ 效果一样,代码更优雅!


七、带参数的函数 + 装饰器

def my_decorator(func):# wrapper 接收参数def wrapper(a, b):print("计算开始")func(a, b)print("计算结束")return wrapper@my_decorator
def add(a, b):print(f"{a} + {b} = {a + b}")add(10, 20)

运行结果

计算开始
10 + 20 = 30
计算结束

八、万能装饰器(适配所有函数)

使用 *args**kwargs 适配任意参数、任意返回值

def decorator(func):def wrapper(*args, **kwargs):print("===== 功能开始 =====")result = func(*args, **kwargs)print("===== 功能结束 =====")return resultreturn wrapper@decorator
def add(a, b):return a + bprint(add(1, 2))

九、装饰器经典案例:计时功能

计算函数执行时间(企业最常用)

import time# 计时装饰器
def timer(func):def wrapper(*args, **kwargs):start = time.time()res = func(*args, **kwargs)end = time.time()print(f"函数执行耗时:{end - start:.4f} 秒")return resreturn wrapper@timer
def test():time.sleep(1)test()

十、装饰器经典案例:日志功能

def log(func):def wrapper(*args, **kwargs):print(f"调用函数:{func.__name__}")print(f"参数:{args} {kwargs}")return func(*args, **kwargs)return wrapper@log
def add(a, b):return a + badd(10, 20)

十一、多个装饰器叠加

def decorator1(func):def wrapper():print("装饰器1 —— 前")func()print("装饰器1 —— 后")return wrapperdef decorator2(func):def wrapper():print("装饰器2 —— 前")func()print("装饰器2 —— 后")return wrapper# 执行顺序:从上到下装饰,从内到外执行
@decorator1
@decorator2
def func():print("我是原函数")func()

十二、带参数的装饰器(高级)

def log_level(level):def decorator(func):def wrapper(*args, **kwargs):print(f"[{level}] 执行函数")return func(*args, **kwargs)return wrapperreturn decorator@log_level("INFO")
def test():print("Hello")test()

十三、闭包 vs 装饰器(总结表)

名称 关系 作用 形式
闭包 基础 保存数据、嵌套函数 外函数返内函数
装饰器 闭包应用 增强函数功能 @xxx

十四、 重点总结

  1. 闭包 = 嵌套函数 + 使用外部变量 + 返回内部函数
  2. 闭包可以记住外部环境,延长变量生命周期
  3. 装饰器 = 闭包 + 语法糖 @
  4. 装饰器不修改原函数,就能增加功能
  5. 万能装饰器使用 *args, **kwargs
  6. 常用场景:计时、日志、权限、缓存
http://www.jsqmd.com/news/592327/

相关文章:

  • 3分钟学会:无需电脑的iOS应用直装神器App-Installer终极指南
  • 颠覆式采集:3步解锁百万级数据价值——TikTokCommentScraper开源方案全解析
  • 终极Windows内存管理方案:Mem Reduct深度技术解析与专业调优指南
  • 连锁品牌门店发光标识常见问题解答(2026专家版) - 速递信息
  • 基于OpenSees的梁柱节点建模与十字节点模拟:JOINT2d单元与element beam...
  • ControlNet++架构深度解析:多模态融合机制与SDXL一体化控制网络实现
  • 告别繁琐环境配置,在快马平台一键生成并运行你的python数据处理脚本
  • Python中线程和进程详解:从入门到高并发实战
  • League Akari:英雄联盟智能工具集的技术架构与实践解析
  • 2026年徐州代理记账精准服务公司推荐,口碑好的有几家 - myqiye
  • AIVideo效果展示:AI自动识别文案重点句并强化配音重音的真实效果
  • 深聊不锈钢全屋定制门店,固家十里河闽龙店口碑好服务强 - mypinpai
  • 从ATE机台视角看DFT:手把手配置test_default_strobe与width保障测试稳定性
  • 效率革命:PowerToys Image Resizer 极简操作重塑图片处理流程
  • 实战演练:基于快马AI快速打造电商级智能搜索下拉词应用
  • Windows Android集成新方案:轻量级应用运行与跨系统应用管理实战指南
  • 2026年哈尔滨别墅装饰公司选购,售后完善的为尚装饰靠谱 - myqiye
  • 手把手教你设计低噪声前置放大电路:电荷、电压、电流三种方案全解析
  • LaMa图像修复系统实战指南:从部署到效率优化
  • 2026年北京好用的不锈钢全屋定制推荐,预算控制有妙招 - 工业品牌热点
  • 电子商城|基于springboot + vue电子商城管理系统(源码+数据库+文档)
  • OpCore-Simplify:智能化工具驱动的OpenCore EFI构建效率提升实践
  • 快速构建排序算法可视化原型:用快马平台一键生成交互演示
  • 告别玄学调参:用SAM-BiGRU预测锂电池RUL,我的超详细参数优化笔记
  • 如何用WinDiskWriter在Mac上制作Windows启动盘:解决4大痛点的完整指南
  • 不锈钢全屋定制店面多少钱,北京值得选的店铺有哪些 - 工业推荐榜
  • 聊聊枣庄全房定制,赢迪家居价格多少钱? - 工业品牌热点
  • MedGemma-X实战案例:如何用AI辅助完成日常放射科阅片工作
  • PlayIntegrityFix项目:5个步骤修复Android设备完整性验证
  • Ryujinx模拟器:从零到精通的高效配置终极指南