遍历后,Python生成器对象是否变得“无法使用”?

时间:2011-08-06 08:40:15

标签: python flask

我正在开发一个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)

1 个答案:

答案 0 :(得分:9)

是的,生成器可以被消耗一次。每次我们迭代一个生成器时,我们要求它给我们另一个值,如果没有更多的值可以抛出StopIteration异常,这将停止迭代。生成器无法知道我们想要再次迭代它而不克隆它。

只要记录能够很好地适应内存,我就会使用一个列表:

top_stories = list(top_stories)

这样你可以多次迭代top_stories。

有一个名为itertools.tee的函数来复制一个也可以帮助你的迭代器,但它有时比使用列表慢。 参考: http://docs.python.org/library/itertools.html?highlight=itertools.tee#itertools.tee