我正在开发一个Flask项目,从API包装器中获取一些数据。包装器返回了一个生成器对象,因此在将值传递给Flask的print
之前我for obj in gen_object: print obj
了值(render_template()
)。
在print
对象请求页面时,页面为空。但是删除for
循环页面会呈现生成器对象的内容。
@app.route('/')
def front_page():
top_stories = r.get_front_page(limit=10)
# this for loop prevents the template from rendering the stories
for s in top_stories:
print s
return render_template('template.html', stories=top_stories)
答案 0 :(得分:9)
是的,生成器可以被消耗一次。每次我们迭代一个生成器时,我们要求它给我们另一个值,如果没有更多的值可以抛出StopIteration异常,这将停止迭代。生成器无法知道我们想要再次迭代它而不克隆它。
只要记录能够很好地适应内存,我就会使用一个列表:
top_stories = list(top_stories)
这样你可以多次迭代top_stories。
有一个名为itertools.tee的函数来复制一个也可以帮助你的迭代器,但它有时比使用列表慢。 参考: http://docs.python.org/library/itertools.html?highlight=itertools.tee#itertools.tee