一、基础概念
1. 什么是迭代器?
- 定义:迭代器是一个能记住遍历位置的"智能指针"
- 特征: 通过 next() 获取下一个值 遍历结束后会触发 StopIteration 异常 只能前进不能后退
2. 什么是生成器?
- 定义:一种用函数创建的迭代器(特殊迭代器)
- 特征: 使用 yield 关键字 自动实现迭代协议 节省内存(需要时生成值)
二、代码示例详解
示例1:手动使用迭代器
# 列表是可迭代对象(Iterable),但不是迭代器
fruits = ["苹果", "香蕉", "橙子"]
# 转换为迭代器
fruit_iter = iter(fruits) # 相当于 fruits.__iter__()
# 手动获取值
print(next(fruit_iter)) # 苹果(相当于 fruit_iter.__next__())
print(next(fruit_iter)) # 香蕉
print(next(fruit_iter)) # 橙子
# print(next(fruit_iter)) # 报错 StopIteration
示例2:生成器基本用法
# 普通函数 vs 生成器函数
def simple_func():
return [1,2,3] # 一次性返回所有数据
def gen_func():
yield 1 # 暂停函数,返回1
yield 2 # 从暂停处恢复,返回2
yield 3 # 继续恢复,返回3
# 测试对比
print(simple_func()) # [1,2,3](立即占用内存)
gen = gen_func() # 创建生成器对象(不立即执行)
print(next(gen)) # 1(首次调用开始执行到第一个yield)
print(next(gen)) # 2(从上次暂停位置继续)
print(next(gen)) # 3
# print(next(gen)) # 触发 StopIteration
示例3:生成器的实际应用场景
# 生成器处理大文件(避免内存爆炸)
def read_big_file(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
for line in f: # 文件对象本身就是迭代器
yield line.strip() # 逐行处理
# 使用示例(假设文件有100万行)
for line in read_big_file('huge_data.txt'):
# 每次只处理一行,内存中永远只存一行
process_data(line) # 你的数据处理函数
三、斐波那契生成器(带详细注释)
def fibonacci(max_count=None):
"""
生成斐波那契数列的生成器
:param max_count: 最大生成数量,None表示无限生成
"""
a, b = 0, 1 # 初始化前两个值
count = 0
while True:
if max_count is not None and count >= max_count:
return # 结束生成
yield a # 生成当前值
# 更新数值(数学公式:F(n) = F(n-1) + F(n-2))
a, b = b, a + b
count += 1
# 使用示例1:生成前10个数
print("前10个斐波那契数:")
fib_gen = fibonacci(10)
for num in fib_gen: # 生成器可以直接用于for循环
print(num, end=' ')
# 输出:0 1 1 2 3 5 8 13 21 34
# 使用示例2:无限生成(需要手动控制次数)
print("\\\\n\\\\n前5个无限生成的数:")
inf_fib = fibonacci() # 不传参数表示无限生成
for _ in range(5):
print(next(inf_fib), end=' ')
# 输出:0 1 1 2 3
四、关键区别总结表
特性 | 普通函数 | 生成器函数 | 迭代器 |
返回值 | 立即返回所有结果 | 生成器对象 | 迭代器对象 |
内存占用 | 高 | 极低(按需生成) | 取决于实现 |
执行流程 | 一次性执行完 | 可暂停/恢复 | 逐步推进 |
典型应用场景 | 常规数据处理 | 大数据/无限序列 | 遍历容器元素 |
五、新人常见问题
- 为什么需要生成器?
- 处理海量数据时避免内存溢出(如:读取10GB日志文件)
- 需要生成无限序列时(如:实时传感器数据流)
- yield 和 return 的区别?
- return:结束函数,返回结果
- yield:暂停函数,记住当前位置,下次继续执行
- 如何判断是否是迭代器?
- from collections.abc import Iterator print(isinstance([1,2,3], Iterator)) # False(列表不是迭代器) print(isinstance(iter([1,2,3]), Iterator)) # True
六、动手练习
- 基础题:实现一个生成器,生成指定长度的等比数列(如:2的n次方)
- 进阶题:创建可以倒计时的生成器(输入5 → 生成5,4,3,2,1)
- 挑战题:用生成器实现文件关键词实时搜索(边读取边匹配)
通过今天的学习,你将掌握处理大数据流的核心技能,这是成为Python高手的重要一步!