假设我有一个迭代生成器的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”准备就绪之前遍历整个列表,这使得它只是一个迭代器预制列表,而不是对象有用意义上的生成器。
无论如何都要张贴,因为我自己找不到这样的问题。 (另外,也许有人还有一些有趣的事情可以说)
答案 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
无法做到这一点,那么可能没有其他(一般)解决方案。