Python生成器对象是否变为;“无法使用”;在被穿越之后?

Python生成器对象是否变为;“无法使用”;在被穿越之后?,python,flask,Python,Flask,我在做一个Flask项目,从API包装器中获取一些数据。包装器返回了一个生成器对象,因此在将其传递到Flask的渲染模板()之前,我打印了gen_对象中obj的值(:print obj) 在打印对象时请求页面时,页面为空。但是删除for循环会使页面呈现生成器对象的内容 @app.route('/') def front_page(): top_stories = r.get_front_page(limit=10) # this for loop prevents the tem

我在做一个Flask项目,从API包装器中获取一些数据。包装器返回了一个生成器对象,因此在将其传递到Flask的
渲染模板()之前,我打印了gen_对象中obj的值(
:print obj

在打印对象时请求页面时,页面为空。但是删除
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)

是的,发电机需要消耗一次。每次我们迭代一个生成器时,我们要求它给我们另一个值,如果没有更多的值给我们,就会抛出StopIteration异常,这将停止迭代。生成器无法知道我们希望在不克隆它的情况下再次迭代它

只要这些记录能很好地保存在记忆中,我会使用列表来代替:

top_stories = list(top_stories)
这样,您就可以多次迭代顶级故事

有一个名为itertools.tee的函数可以复制迭代器,迭代器也可以帮助您,但它有时比仅使用列表慢。 参考:

它可能也不会比使用列表更节省内存,这取决于teed迭代器的不同使用之间的距离。