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

Python-100-Days装饰器与生成器:提升代码优雅度的工具

Python-100-Days装饰器与生成器:提升代码优雅度的工具

【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days

Python-100-Days是一套从新手到大师的Python学习教程,其中装饰器和生成器是提升代码优雅度的重要工具。装饰器可以为函数添加额外功能而不修改原函数代码,生成器则能高效处理大量数据或无限序列,两者都是Python编程中的实用技能。

什么是装饰器?

装饰器是Python的特色语法,它允许在不修改原函数代码的情况下为函数添加额外功能。简单来说,装饰器就是"用一个函数装饰另一个函数并为其提供额外能力"的语法现象。

装饰器的基本结构

装饰器本质上是一个高阶函数,它接收被装饰的函数作为参数,并返回一个带有装饰功能的新函数。基本结构如下:

def record_time(func): def wrapper(*args, **kwargs): # 执行额外功能的代码 result = func(*args, **kwargs) # 执行额外功能的代码 return result return wrapper

装饰器的使用方法

使用装饰器有两种方式,一种是直接调用装饰器函数,另一种是使用更便捷的语法糖@装饰器函数

@record_time def download(filename): print(f'开始下载{filename}.') # 下载文件的代码 print(f'{filename}下载完成.')

实用装饰器示例

1. 记录函数执行时间
import time from functools import wraps def record_time(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f'{func.__name__}执行时间: {end - start:.2f}秒') return result return wrapper
2. 单例模式装饰器
from functools import wraps def singleton(cls): instances = {} @wraps(cls) def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class President: pass

什么是生成器?

生成器是语法简化版的迭代器,它使用yield关键字来返回值,每次调用next()方法时会从上次暂停的地方继续执行。

生成器的基本语法

def fib(num): """生成器""" a, b = 0, 1 for _ in range(num): a, b = b, a + b yield a

生成器的应用场景

1. 生成斐波那契数列
def fibonacci(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + b # 使用生成器 for num in fibonacci(10): print(num)
2. 流式数据处理

生成器非常适合处理大型数据集或流式数据,因为它不需要一次性将所有数据加载到内存中:

def process_large_file(file_path): with open(file_path, 'r') as f: for line in f: # 处理每一行数据 yield process_line(line)

生成器表达式

除了生成器函数,Python还提供了生成器表达式,语法类似列表推导式,但使用圆括号:

# 生成器表达式 even_numbers = (x for x in range(100) if x % 2 == 0) # 列表推导式 even_numbers_list = [x for x in range(100) if x % 2 == 0]

生成器表达式比列表推导式更节省内存,特别是处理大量数据时。

装饰器与生成器的高级应用

带参数的装饰器

装饰器本身也可以接受参数,这需要在原有的装饰器外层再包装一层函数:

from functools import wraps from time import time def record(output): """可以参数化的装饰器""" def decorate(func): @wraps(func) def wrapper(*args, **kwargs): start = time() result = func(*args, **kwargs) output(func.__name__, time() - start) return result return wrapper return decorate

生成器作为协程

生成器可以通过send()方法接收数据,从而实现协程功能:

def calc_avg(): """流式计算平均值""" total, counter = 0, 0 avg_value = None while True: value = yield avg_value total, counter = total + value, counter + 1 avg_value = total / counter # 使用协程 gen = calc_avg() next(gen) # 初始化生成器 print(gen.send(10)) # 10.0 print(gen.send(20)) # 15.0 print(gen.send(30)) # 20.0

总结

装饰器和生成器是Python中非常强大的特性,它们可以帮助我们写出更优雅、更高效的代码:

  • 装饰器:用于增强函数功能,实现代码复用和逻辑分离,常见应用有日志记录、性能分析、权限验证等。
  • 生成器:用于创建迭代器,特别适合处理大数据集和流式数据,能够有效节省内存并提高程序性能。

通过Day01-20/17.函数高级应用.md和Day31-35/31.Python语言进阶.md等教程,我们可以深入学习这些特性的更多用法和最佳实践。掌握装饰器和生成器,将使你的Python编程技能提升到一个新的水平!

【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/506935/

相关文章:

  • 数据集处理革命:Yi-Coder-1.5B智能数据清洗方案
  • GitHub_Trending/ms/MS-DOS引导扇区代码分析:系统启动的第一扇区
  • 勃农免耕机制造企业价格多少,性价比咋样? - 工业推荐榜
  • 基于STM32的智能衣柜环境自适应调节系统开发
  • MQTT Retain / Last Will / Clean Session 深度解析:智能设备在线状态设计
  • YLB3118@ACP# 芯片产品规格解析及应用场景总结
  • Dioxus组件样式方案对比:CSS-in-Rust vs CSS Modules
  • 好用的勃农免耕机品牌,吉林地区有靠谱厂家推荐吗? - myqiye
  • Cloudflare测速文件终极指南:如何用官方链接精准测试你的网络带宽(附100MB-1GB链接)
  • 当我的“龙虾”OpenClaw 决定通宵修仙:24 小时生成 700 万字《凡人修仙传》实录
  • 【Linux:文件 + 进程】进程间通信进阶(2)
  • 2026东莞房屋装修攻略:鲁班装饰全案整装解决8大核心痛点 - 速递信息
  • MogFace-large模型效果可视化:使用Matplotlib绘制PR曲线与混淆矩阵
  • 2026年3月轻集料混凝土批发厂家热门推荐,速来了解,专业的轻集料混凝土深度剖析助力明智之选 - 品牌推荐师
  • ViGEmBus虚拟游戏控制器驱动:终极安装与使用完整指南
  • 磁力密封与高精度控制双核心:206高温高压釜技术优势及市场洞察 - 品牌推荐大师
  • WarcraftHelper完整指南:终极解决魔兽争霸3现代系统兼容性问题
  • 小米新模型让社区对 DeepSeek V4 耿耿于怀:但真正的变量,可能根本不在 benchmark 上
  • 逆向实战:Buuctf网鼎杯jocker题目中的堆栈修复与动态调试技巧
  • 2026年苏州雨水收集设备来样定制厂家推荐,费用怎么算 - mypinpai
  • Zig日志聚合:集中管理应用日志的终极指南
  • QML系统时间日期处理详解
  • 一站式Windows部署神器:MediaCreationTool.bat高效解决全版本系统安装难题
  • 2026年教育招聘公司分析:有实战演练培训的公司怎么选择? - 工业品牌热点
  • ASTM D4169标准,ASTM D4169最常用的选择,如何进行ASTMD4169测试
  • 电容充电仿真实战:用LTspice XVII验证RC电路的时间常数理论
  • 解决OSX-KVM黑屏问题:EFI日志分析与排错流程
  • Z-Image-Turbo-辉夜巫女网络配置详解:保障模型API在复杂计算机网络中的稳定访问
  • Ostrakon-VL-8B惊艳效果:同一模型完成文字识别、合规打分、改进建议生成
  • C#项目中添加本地数据库——SQLite