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

6个月Python学习计划 Day 16 - 迭代器、生成器表达式、装饰器入门

第三周 Day 2

🎯 今日目标

  • 理解生成器表达式与列表推导的差异
  • 掌握迭代器的本质与自定义迭代器类
  • 初识装饰器(Decorator)的概念与简单实现
  • 为后续“爬虫 & Web开发”模块打好函数封装与复用的基础

📍 生成器表达式(Generator Expression)

生成器表达式语法类似列表推导式,但使用的是 () 而不是 [],返回的是生成器对象,具有惰性计算的特点。

✅ 示例:

gen = (x**2 for x in range(5))
print(next(gen))  # 输出 0
print(list(gen))  # 输出 [1, 4, 9, 16]

✅ 和列表推导对比:

特性列表推导式生成器表达式
语法[]()
返回类型列表(一次性加载)生成器(惰性迭代)
占用内存高(一次性生成所有结果)低(按需生成)

🔁 自定义迭代器类(Iterator Class)

自定义类中实现 iter() 和 next() 方法即可成为可迭代对象。

✅ 示例:

class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current <= 0:raise StopIterationself.current -= 1return self.current + 1cd = CountDown(5)
for i in cd:print(i)

输出:

5
4
3
2
1

🎁 装饰器(Decorator)基础

装饰器是一种高级语法,用来在不修改原函数代码的前提下扩展功能,本质是函数嵌套与高阶函数结合。

✅ 基本语法

def log(func):def wrapper():print("开始执行函数...")func()print("函数执行完毕。")return wrapper@log
def say_hello():print("Hello!")say_hello()

输出:

开始执行函数...
Hello!
函数执行完毕。

💡 装饰器应用场景

  • 日志打印
  • 权限验证(登录后才能访问)
  • 性能统计(记录函数耗时)
  • 缓存(装饰器+字典)

🧪 今日练习任务

✅ 练习1:用生成器表达式生成 100 个偶数,并取前 5 个

gen = (x for x in range(0, 200, 2))
for _ in range(5):print(next(gen))

✅ 练习2:写一个自定义迭代器类,输出 1~n 的平方

class Square:def __init__(self, n):self.n = nself.i = 1def __iter__(self):return selfdef __next__(self):if self.i > self.n:raise StopIterationval = self.i ** 2self.i += 1return valfor s in Square(5):print(s)

✅ 练习3:写一个装饰器,用于打印函数运行前后的时间

import timedef timer(func):def wrapper():start = time.time()func()end = time.time()print(f"耗时:{end - start:.4f} 秒")return wrapper@timer
def run():time.sleep(1)print("执行中...")run()

📌 今日总结

内容说明
生成器表达式与列表推导类似,但更节省内存
自定义迭代器通过 iter() 和 next() 组合实现
装饰器基础用于增强函数功能,常用于日志、验证等场景
实战练习结合语法 + 应用,强化实际编程能力
http://www.xdnf.cn/news/12496.html

相关文章:

  • 【汇编逆向系列】八、函数调用包含混合参数-8种参数传参,条件跳转指令,转型指令,movaps 16字节指令
  • 第16届蓝桥杯青少Scratch 4月stema——飞翔的小燕子
  • 二叉树基础全解:存储方式、遍历原理与查找树对比
  • Go垃圾回收参数调优:实现低延迟服务的实战指南
  • MongoDB检查慢查询db.system.profile.find 分析各参数的作用
  • 一篇文章实现Android图片拼接并保存至相册
  • 4082N信号频谱分析仪
  • 设置应用程序图标
  • Android设备推送traceroute命令进行网络诊断
  • 晨控CK-FR102ANS与欧姆龙NX系列PLC配置EtherNet/IP通讯配置操作手册
  • 96.如何使用C#实现串口发送? C#例子
  • 数据结构与算法——二叉树高频题目(1)
  • Oracle数据库学习笔记 - 创建、备份和恢复
  • html表格转换为markdown
  • 测试设计技术全解析:黑盒与白盒测试的七种武器与覆盖率指标
  • 深入解析Java中的装箱与拆箱机制
  • CMOS图像传感器系列--(一)像素设计基础
  • BEV和OCC学习-5:数据预处理流程
  • 全生命周期的智慧城市管理
  • Qemu arm操作系统开发环境
  • Python图像处理基础(五)
  • 第34次CCF-CSP认证真题解析(目标300分做法)
  • 预训练语言模型T5-11B的简要介绍
  • 精益数据分析(95/126):Socialight的定价转型启示——B2B商业模式的价格策略与利润优化
  • 外卖大战背后的创始人IP智慧:差异化、护城河与心智占领
  • c++中的输入输出流(标准IO,文件IO,字符串IO)
  • GenAI 工程师学习路径总结
  • 【EN18031】标准系列深度解读
  • C++中的概念(Concepts)
  • ABP VNext 与 Neo4j:构建基于图数据库的高效关系查询