我有两个函数,它们都将迭代器作为输入.有没有办法写一个发生器,我可以提供给两个函数作为输入,这不需要reset或第二次通过?我想对数据进行一次传递,但是将输出提供给两个函数:示例:
def my_generator(data):
for row in data:
yield row
gen = my_generator(data)
func1(gen)
func2(gen)
Run Code Online (Sandbox Code Playgroud)
我知道我可以有两个不同的生成器实例,或者reset在函数之间,但是想知道是否有办法避免对数据进行两次传递.请注意,func1/func2本身不是生成器,这将是很好的因为我可以有一个管道.
这里的要点是尽量避免对数据进行第二次传递.
您可以将生成器结果缓存到列表中,或者 重置生成器以将数据传递到func2. 问题是,如果有 2 个循环,则需要对数据进行两次迭代,因此要么再次加载数据并创建生成器,要么缓存整个结果。
像这样的解决方案itertools.tee也只会创建 2 个迭代,这与第一次迭代后重置生成器基本相同。当然这是语法糖,但它不会改变后台的情况。
如果这里有大数据,就必须合并func1和func2。
for a in gen:
f1(a)
f2(a)
Run Code Online (Sandbox Code Playgroud)
在实践中,设计这样的代码可能是一个好主意,因此可以完全控制迭代过程,并且能够使用单个迭代关联/组合映射和过滤器。