5

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

我的代码:

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

注意:我认为get_top只会返回一个不错的 myModel 列表,我可以执行类似v.name等的操作

4

3 回答 3

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

仅在迭代 f 时查看 f 是如何评估的。您可以在此处找到有关该主题的优秀材料:http ://www.dabeaz.com/generators/

于 2009-04-22T07:55:01.230 回答
7

生成器是一种迭代器。迭代器是一种可迭代对象,与任何其他可迭代对象一样,

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

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

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

top_votes = list(Vote.objects.get_top(myModel, limit=10, reversed=False))
print top_votes[0]

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

>>> 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)
[]

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

于 2009-04-22T08:11:20.923 回答
1

嗯嗯

我已经阅读了这个这个,现在事情已经很清楚了;

实际上我可以通过做将生成器转换为列表

mylist=list(myGenerator)
于 2009-04-22T08:10:28.523 回答