2

假设我有一个迭代生成器的 for 循环,并且在这个循环中我正在构建一个列表以供以后使用:

q = []
for index, val in enumerate(['a', 'b', 'c']):
    q.append(index+val)

我想保留生成器而不创建这样的函数:

def foo(gen):
    for index, val in gen:
        yield index+val

这完全有可能还是我在这里看不到一些固有的问题?
我想它应该看起来像这样:

iter_q = something()
for index, val in enumerate(['a', 'b', 'c']):
    q.add_iteration(index+val)

好的,既然我已经写了这个,它看起来确实是不可能的(或无用的),因为这个 for 循环必须在“生成器”准备好之前遍历整个列表,这使得它只是一个预制列表的迭代器,而不是对象有用意义上的生成器。

无论如何发布,因为我自己找不到这样的问题。(另外,也许有人还有一些有趣的事情要说)

4

2 回答 2

4

如果我正确理解了您的问题,我认为您可能想要一个生成器表达式

q = (index + val for index, val in enumerate(someOtherGenerator))

该语句创建一个新的生成器q,它将像您的foo函数返回的生成器一样工作。您也不需要将其分配给变量,您可以在任何地方创建生成器表达式,例如在函数调用中:

doSomethingWithAGenerator(i+v for i,v in enumerate(someOtherGenerator))

有些类型的生成器不能在生成器表达式中创建,但最常见的类型可以。

于 2012-08-08T15:50:03.620 回答
0

我是这样看的:这itertools.cycle可能是一个函数在迭代器上循环同时假装不耗尽它的最佳示例。它最终创建了整个事物的完整副本。如果itertools不能做得更好,可能没有其他(通用)解决方案。

于 2012-08-08T15:27:14.993 回答