如何调整Python生成器函数,先输出原结果再输出转换结果?
修改生成器输出顺序的实现方案
原代码与输出
原函数实现如下:
import itertools as it def test(x): for i in x: yield i i = list(i) i[1] = "X" yield tuple(i) list(test(it.product(["A", "B"], ["C"])))
执行后输出:
[('A', 'C'), ('A', 'X'), ('B', 'C'), ('B', 'X')]
需求
需要修改test函数,让输出先包含输入生成器的所有原始结果,再依次输出转换后的结果,预期输出:
[('A', 'C'), ('B', 'C'), ('A', 'X'), ('B', 'X')]
修改后的代码
import itertools as it def test(x): # 缓存输入生成器的所有结果,防止生成器迭代一次后耗尽 original_results = list(x) # 先输出所有原始结果 for item in original_results: yield item # 再遍历缓存的结果,生成并输出转换后的版本 for item in original_results: modified = list(item) modified[1] = "X" yield tuple(modified) print(list(test(it.product(["A", "B"], ["C"]))))
说明
因为it.product返回的是生成器对象,这类迭代器只能被遍历一次。所以我们需要先把所有原始结果存入列表缓存,先完成一轮原始结果的输出,再基于缓存的结果生成转换后的内容并输出,这样就能保证输出顺序符合要求。
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

