Django中的“生成器对象”是什么?

2024-06-16 11:06:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用Django voting包时,当我在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等等


Tags: 对象django方法代码false内容getobjects
4条回答

生成器是一种迭代器。迭代器是一种iterable对象,和其他iterable一样

可以使用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

嗯哼

我读过thisthis,现在一切都很清楚了

实际上,我可以通过执行以下操作将生成器转换为列表

mylist=list(myGenerator)

如果需要列表,只需在生成器对象上调用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/

如果需要列表,只需在生成器对象上调用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/

相关问题 更多 >