什么是django中的"生成器对象"?

gat*_*ath 5 python generator

我使用Django投票包,当我在shell中使用方法get_top()时,它返回类似"0x022f7AD0的生成器对象,我之前从未见过这样的东西,你如何访问它,它是什么?

我的代码:

v=Vote.objects.get_top(myModel, limit=10, reversed=False)
print v
<generator object at 0x022f7AD0>
Run Code Online (Sandbox Code Playgroud)

注意:我认为get_top只会返回一个很好的myModel列表,我可以做一些像v.name

bay*_*yer 20

如果你想要一个列表,只需在你的生成器对象上调用list().

python中的生成器对象就像一个惰性列表.只有在迭代它们时才会评估元素.(因此,它上面的调用列表会评估所有这些.)

例如,您可以这样做:

>>> def f(x):
...  print "yay!"
...  return 2 * x
>>> g = (f(i) for i in xrange(3))    # generator comprehension syntax
>>> g
<generator object <genexpr> at 0x37b6c0>

>>> for j in g: print j
... 
yay!
0
yay!
2
yay!
4
Run Code Online (Sandbox Code Playgroud)

了解f在迭代它时如何评估f.您可以在这里找到关于该主题的优秀材料:http://www.dabeaz.com/generators/


Mil*_*les 7

生成器是一种迭代器.迭代器是一种可迭代的对象,和任何其他迭代对象一样,

您可以使用for循环遍历每个项目:

for vote in Vote.objects.get_top(myModel, limit=10, reversed=False):
    print v.name, vote
Run Code Online (Sandbox Code Playgroud)

如果需要按索引访问项目,可以将其转换为列表:

top_votes = list(Vote.objects.get_top(myModel, limit=10, reversed=False))
print top_votes[0]
Run Code Online (Sandbox Code Playgroud)

但是,您只能迭代迭代器的特定实例一次(与更通用的可迭代对象(如列表)不同):

>>> top_votes_generator = Vote.objects.get_top(myModel, limit=3)
>>> top_votes_generator
<generator object at 0x022f7AD0>
>>> list(top_votes_generator)
[<Vote: a>, <Vote: b>, <Vote: c>]
>>> list(top_votes_generator)
[]
Run Code Online (Sandbox Code Playgroud)

有关创建自己的生成器的更多信息,请参阅http://docs.python.org/tutorial/classes.html#generators