目录

  1. 引言
  2. Python 迭代器
  3. Python 生成器
  4. 迭代器 vs 生成器
  5. 完整示例
  6. 结论
  7. 参考资料

1. 引言

在 Python 中,迭代器生成器 是用于处理可迭代对象(如列表、元组、字典等)的两种重要机制。

  • 迭代器(Iterator):提供一种按需访问元素的方法,并避免一次性加载整个数据集。
  • 生成器(Generator):是一种特殊的迭代器,使用 yield 语句返回数据,支持惰性计算,减少内存开销。

本教程将详细介绍 迭代器和生成器 的工作原理、使用方式和应用场景。


2. Python 迭代器

2.1 什么是迭代器?

Python 的迭代器是 实现了 __iter__()__next__() 方法的对象,用于逐步访问数据,而不会一次性将所有数据加载到内存中。


2.2 迭代器的工作原理

Python 中的可迭代对象(如 list, tuple, dict, set)可以使用 iter() 方法转换为迭代器,然后通过 next() 方法获取元素。

numbers = [1, 2, 3, 4]
iterator = iter(numbers)  # 获取迭代器

print(next(iterator))  # 输出: 1
print(next(iterator))  # 输出: 2
print(next(iterator))  # 输出: 3
print(next(iterator))  # 输出: 4

当迭代器没有更多元素可供迭代时,会引发 StopIteration 异常。


2.3 创建自定义迭代器

可以通过 自定义一个迭代器,实现 __iter__()__next__() 方法。

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

    def __iter__(self):
        return self  # 迭代器对象本身

    def __next__(self):
        if self.current >= self.end:
            raise StopIteration  # 终止迭代
        value = self.current
        self.current += 1
        return value

counter = Counter(1, 5)
for num in counter:
    print(num)  # 输出: 1 2 3 4


3. Python 生成器

3.1 什么是生成器?

生成器(Generator)是一种特殊的迭代器,它 不会一次性生成所有数据,而是 每次调用 next() 时才计算并返回下一个值

Python 生成器的特点:

  1. 使用 yield 关键字,不需要定义 __iter__()__next__()
  2. 支持状态保存,每次执行 yield,函数暂停,下一次继续执行。
  3. 减少内存消耗,适用于大规模数据处理。

3.2 生成器的语法

使用 yield 关键字定义生成器。

def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

当没有更多值可 yield 时,会引发 StopIteration


3.3 生成器与 return 的区别

  • return 直接终止函数,而 yield 会暂停并保存函数状态
  • return 只能返回一次值,而 yield 可以多次产生值
def with_return():
    return "Hello"
    return "World"  # 这一行永远不会执行

print(with_return())  # 输出: Hello

def with_yield():
    yield "Hello"
    yield "World"

gen = with_yield()
print(next(gen))  # 输出: Hello
print(next(gen))  # 输出: World


3.4 生成器的状态控制

使用 send() 方法可以向生成器发送值,并恢复执行。

def generator_with_send():
    value = yield "Start"
    yield f"Received: {value}"

gen = generator_with_send()
print(next(gen))  # 输出: Start
print(gen.send("Hello"))  # 输出: Received: Hello


4. 迭代器 vs 生成器

特性迭代器生成器
语法需要实现 __iter__()__next__()使用 yield
内存占用可能较高仅按需生成数据
可读性代码较复杂代码简洁
应用场景适用于自定义迭代逻辑适用于大数据流

5. 完整示例

自定义迭代器 vs 生成器

# 自定义迭代器
class FibonacciIterator:
    def __init__(self, max_num):
        self.a, self.b = 0, 1
        self.max_num = max_num

    def __iter__(self):
        return self

    def __next__(self):
        if self.a > self.max_num:
            raise StopIteration
        value = self.a
        self.a, self.b = self.b, self.a + self.b
        return value

# 生成器版本
def fibonacci_generator(max_num):
    a, b = 0, 1
    while a <= max_num:
        yield a
        a, b = b, a + b

# 使用迭代器
print("Iterator:")
for num in FibonacciIterator(10):
    print(num, end=" ")  # 输出: 0 1 1 2 3 5 8

print("\nGenerator:")
# 使用生成器
for num in fibonacci_generator(10):
    print(num, end=" ")  # 输出: 0 1 1 2 3 5 8


6. 结论

  • 迭代器:适用于需要更复杂迭代逻辑的情况,需实现 __iter__()__next__()
  • 生成器:更简洁的迭代方式,适用于流式数据处理,降低内存消耗。
  • 推荐使用生成器,除非自定义需求较高。

7. 参考资料

  1. Python 官方文档 – 迭代器与生成器https://docs.python.org/3/tutorial/classes.html#iterators
  2. Real Python – Generatorshttps://realpython.com/introduction-to-python-generators/
  3. W3Schools – Python Generatorshttps://www.w3schools.com/python/python_generators.asp

站内链接