python - 如何使用生成器创建另一个生成器而不定义新函数?

时间:2012-08-08 15:19:09

标签: python generator

假设我有一个迭代生成器的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循环必须在“generator”准备就绪之前遍历整个列表,这使得它只是一个迭代器预制列表,而不是对象有用意义上的生成器。

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

2 个答案:

答案 0 :(得分:4)

如果我正确理解你的问题,我想你可能想要generator expression

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

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

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

有些种类的生成器无法在生成器表达式中生成,但最常见的类型可以是。

答案 1 :(得分:0)

我这样看待它:itertools.cycle可能是循环迭代器的函数的最佳示例,同时假装不会耗尽它。它最终创建了整个事物的完整副本。如果itertools无法做到这一点,那么可能没有其他(一般)解决方案。