我使用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/
生成器是一种迭代器.迭代器是一种可迭代的对象,和任何其他迭代对象一样,
您可以使用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
| 归档时间: |
|
| 查看次数: |
8751 次 |
| 最近记录: |