在python中深度复制生成器

在python中深度复制生成器,python,generator,Python,Generator,我使用的是一个生成器函数,比如: def foo(): i=0 while (i<10): i+=1 yield i 很明显,我可以用带计数器的正则函数来解决这个问题。 但是我真的在寻找使用生成器的解决方案。对于itertools.tee的注释也是我的第一个猜测。由于警告您在使用tee后不应再推进原始生成器,我可能会编写类似这样的内容来衍生副本: >>> from itertools import tee >&g

我使用的是一个生成器函数,比如:

def foo():
    i=0
    while (i<10):
         i+=1
         yield i
很明显,我可以用带计数器的正则函数来解决这个问题。
但是我真的在寻找使用生成器的解决方案。

对于
itertools.tee的注释也是我的第一个猜测。由于警告您在使用tee后不应再推进原始生成器,我可能会编写类似这样的内容来衍生副本:

>>> from itertools import tee
>>>
>>> def foo():
...   i = 0
...   while i < 10:
...     i += 1
...     yield i
...
>>>
>>> it = foo()
>>> it.next()
1
>>> it, other = tee(it)
>>> it.next()
2
>>> other.next()
2
来自itertools导入三通的
>>
>>>
>>>def foo():
...   i=0
...   当我<10时:
...     i+=1
...     产量一
...
>>>
>>>it=foo()
>>>it.next()
1.
>>>it,其他=T形三通(it)
>>>it.next()
2.
>>>其他
2.

我可以想到三种情况:

  • 生成器并没有副作用,您只希望能够遍历已经捕获的结果。你可以考虑一个代替真正的生成器。您还可以共享缓存的生成器,如果任何客户端转到您尚未访问的项目,它将前进。这类似于tee()方法,但在生成器/缓存中执行tee功能,而不是要求客户端执行

  • 生成器有副作用,但没有历史记录,您希望能够在任何地方重新启动。考虑把它写为A,在那里你可以在任何时候传递这个值。p>
  • 生成器具有副作用和历史记录,这意味着生成器在G(x)处的状态取决于G(x-1)的结果,因此您不能将x传递回它以从任何地方开始。在这种情况下,我认为您需要更具体地说明您正在尝试做什么,因为结果不仅取决于生成器,还取决于其他数据的状态。在这种情况下,可能有更好的方法


我认为这是不可能的。如果您只需要对结果进行两次迭代,那么请阅读
列表
并多次迭代
列表
,或者
itertools.tee
可能会有所帮助。不过,它并没有复制生成器,只是将结果存储在一个队列中,稍后再将其吐出。因此,当您读取“副本”(可能是您希望从生成器的真实克隆中获得的副本)时,函数的任何副作用都不会再次执行,如果您从“副本”中读取,它将推进底层生成器--一旦您使用了TEE,您基本上需要所有的阅读器使用TEE,不是原来的。你真正想解决的问题是什么?有多种可能的答案。您可能已经知道这一点,但是
Define
不是合法的python。正确的关键字是
def
Nope,编辑后仍然错误。Case在Python中很重要<代码>定义
也不合法。只需
def
。不应使用名称
new
,因为它也是一个模块名称。
>>> from itertools import tee
>>>
>>> def foo():
...   i = 0
...   while i < 10:
...     i += 1
...     yield i
...
>>>
>>> it = foo()
>>> it.next()
1
>>> it, other = tee(it)
>>> it.next()
2
>>> other.next()
2