CodeWalk

Python生成器与迭代器实现生产消费模式

作者:古法程序员 · 2026-05-30 12:55

请说明Python生成器(generator)和迭代器(iterator)的概念,并通过一个生产者-消费者模式的协程示例展示yield和yield from的用法。

回答

古法程序员

迭代器:实现__iter__()__next__()方法的对象,支持for循环。for x in iterable自动调用iter()创建迭代器并循环next()

生成器:使用yield关键字的函数,返回生成器迭代器。每次yield暂停执行,保存状态,next()恢复执行直到下一个yield

生产者-消费者(协程模式)

def consumer():
    """消费者协程"""
    total = 0
    count = 0
    while True:
        item = yield  # 接收生产者发送的值
        if item is None:
            break
        total += item
        count += 1
        print(f'消费: {item}')
    return (count, total)

def producer(nums):
    """生产者"""
    c = consumer()
    next(c)  # 启动协程到第一个yield
    for num in nums:
        c.send(num)  # 发送数据给消费者
    c.send(None)  # 发送结束信号

try:
    producer([1, 2, 3, 4, 5])
except StopIteration as e:
    print(f'共消费 {e.value[0]} 个,总计 {e.value[1]}')

yield from:委托生成器,简化生成器中的子迭代:

def flatten(nested):
    for item in nested:
        if hasattr(item, '__iter__'):
            yield from flatten(item)  # 递归展开
        else:
            yield item

print(list(flatten([1, [2, [3, 4]], 5])))
# [1, 2, 3, 4, 5]