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() 组合实现 |
装饰器基础 | 用于增强函数功能,常用于日志、验证等场景 |
实战练习 | 结合语法 + 应用,强化实际编程能力 |