Python生成器与迭代器实现生产消费模式
请说明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]