Python3 迭代器与生成器

Python3 迭代器与生成器(Iterators & Generators)


🎯 学习目标

掌握 Python 中迭代器(Iterator)生成器(Generator)的基本概念、实现方式及其在处理大数据、惰性求值、节省内存等方面的优势。能够在实际项目中灵活使用迭代器和生成器优化程序性能,提升代码可读性和效率。


🔑 核心重点

分类 内容
基本概念 迭代器是访问集合元素的方式;生成器用于按需生成数据
实现方式 使用 __iter____next__ 方法定义迭代器;使用 yield 定义生成器函数
惰性求值 生成器只在需要时计算下一个值,适合处理大数据流
实际应用场景 大文件读取、日志分析、网络爬虫、无限序列、批量任务调度等
性能优势 相比列表更节省内存,适合大规模数据集

📚 详细讲解

一、什么是迭代器(Iterator)?

迭代器是一个可以记住遍历位置的对象,它不依赖索引机制,适用于任何可遍历的数据结构。

✅ 迭代器的两个核心方法:

  • __iter__():返回迭代器对象本身
  • __next__():返回容器中的下一个元素,没有则抛出 StopIteration

✅ 示例:

my_list = [1, 2, 3]
it = iter(my_list)

print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3
# print(next(it))  # 抛出 StopIteration

📌 所有实现了这两个方法的对象都被称为可迭代对象(Iterable),如 list, dict, str, tuple, set, file 等。


二、自定义迭代器

可以通过定义类来实现自己的迭代器。

✅ 示例:从 1 到 N 的计数器

class MyRange:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.end:
            num = self.current
            self.current += 1
            return num
        else:
            raise StopIteration

for n in MyRange(0, 5):
    print(n)

三、什么是生成器(Generator)?

生成器是一种特殊的迭代器,由带有 yield 关键字的函数创建,每次调用会“记住”执行状态,直到下一次 next() 被调用。

✅ 示例:简单的生成器

def simple_generator():
    yield "First"
    yield "Second"
    yield "Third"

gen = simple_generator()

print(next(gen))  # First
print(next(gen))  # Second
print(next(gen))  # Third

📌 生成器函数 vs 普通函数

  • 普通函数通过 return 返回结果并结束
  • 生成器函数通过 yield 暂停执行并保存状态

四、生成器表达式(Generator Expression)

类似于列表推导式,但使用 () 而不是 [],返回一个生成器对象。

✅ 示例:

nums = (x**2 for x in range(10))

for num in nums:
    print(num)

📌 优点:不会立即生成整个列表,节省内存空间,尤其适合大数据处理。


五、生成器的实际应用

✅ 应用1:逐行读取大文件

def read_large_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            yield line.strip()

for line in read_large_file('big_data.txt'):
    print(line)

📌 优势:避免一次性将整个文件加载到内存中。


✅ 应用2:无限序列生成器(如斐波那契数列)

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci()
for _ in range(10):
    print(next(fib))

📌 输出示例

0
1
1
2
3
5
8
13
21
34

⚠️ 注意事项

  • 不要滥用 yield,确保逻辑清晰易理解
  • 生成器只能遍历一次,不能重复使用
  • 使用生成器处理大数据时注意资源释放(如文件句柄)
  • 避免在生成器中进行耗时操作影响主流程
  • for 循环内部自动处理 StopIteration 异常

🧪 实际案例分析

📌 场景:模拟日志实时监控系统

我们有一个不断追加写入的日志文件 app.log,希望实时读取新增内容。

import time

def follow(file):
    file.seek(0, 2)  # 移动到文件末尾
    while True:
        line = file.readline()
        if not line:
            time.sleep(0.1)  # 等待新内容
            continue
        yield line

with open("app.log", "r") as f:
    for line in follow(f):
        print(line.strip())

📌 说明

  • 使用生成器持续监听新日志
  • 不占用大量内存,适合长期运行的服务
  • 可结合多线程/异步框架构建完整日志分析系统

🧩 拓展练习(动手实践)

  1. 编写一个生成器函数,生成所有小于 N 的质数。
  2. 实现一个迭代器类,模拟队列行为(先进先出)。
  3. 使用生成器读取 CSV 文件,按行返回每条记录。
  4. 编写一个函数,接收一个整数列表,返回一个生成器,仅返回偶数。
  5. 设计一个文本过滤器,使用生成器逐行读取文件并过滤包含特定关键词的行。

📚 推荐阅读


🧭 下一步建议

  • 下一章学习内容:《Python 函数详解(下)—— 高阶函数与装饰器》
  • 掌握函数作为参数传递、闭包、装饰器原理与应用
  • 学习 map(), filter(), reduce() 等高阶函数
  • 探索函数嵌套、柯里化、偏函数等高级技巧
  • 结合迭代器与函数知识,尝试编写模块化、可复用性强的工具函数库

如果你希望我为你提供:

  • Python 迭代器与生成器速查表 PDF(含示例)
  • 更多实战项目练习题(如日志监控器、无限数列生成器、CSV 处理器等)
  • 高级生成器技巧详解(如协程、状态保持、组合多个生成器)
  • 视频教学资源推荐(中文讲解)

欢迎随时告诉我 😊

posted @ 2025-05-28 22:47  红尘过客2022  阅读(56)  评论(0)    收藏  举报