2009-04-22 15 views
4

Djangoの投票パッケージを使用していますが、シェルでget_top()メソッドを使用すると、"0x022f7AD0のジェネレータオブジェクトのようなものが返されます。これまで何も見たことがありません。それdjangoの "ジェネレータオブジェクト"とは何ですか?

私のコード:?

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

NB:私はちょうど私がv.nameような何かを行うことができますmymodelというの素敵なリストを、返されますget_topを考えなど

答えて

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を参照してください。あなたはここで話題に優れた材料を見つけることができます:私はthisthisを読んで、物事が今明らかに静かです

http://www.dabeaz.com/generators/

1

うーむ。

実際に私はちょうどジェネレータはイテレータの一種である

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

を参照してください。
関連する問題