2009-04-22 50 views
4

我使用的是Django投票軟件包,當我在shell中使用方法get_top()時,它返回類似於「0x022f7AD0」的發電機對象,我以前從未見過類似的東西,您如何訪問它以及什麼是它什麼是django中的「generator object」?

我的代碼:?

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

NB:我想get_top將只返回基於myModel的一個很好的名單,我可以做這樣的事情v.name

回答

20

如果你想要一個列表,只需在你的generator對象上調用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評估。您可以在這裏的主題找到優良的材質:http://www.dabeaz.com/generators/

1

Hmmmm

我讀過thisthis,事情現在很安靜清晰;

其實我可以轉換髮電機通過只是在做

mylist=list(myGenerator) 
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

相關問題