Что такое «генератор объекта» в Django? - PullRequest
4 голосов
/ 22 апреля 2009

Я использую пакет голосования Django, и когда я использую метод get_top () в оболочке, он возвращает что-то вроде "объекта генератора в 0x022f7AD0 , я никогда не видел ничего подобного раньше получить к нему доступ и что это?

мой код:

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

NB: я думал, get_top просто вернет хороший список myModel, который я могу сделать что-то вроде v.name и т. Д.

Ответы [ 3 ]

20 голосов
/ 22 апреля 2009

Если вам нужен список, просто вызовите 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/

7 голосов
/ 22 апреля 2009

Генератор - это своего рода итератор. Итератор - это своего рода итеративный объект, и, как и любой другой итерируемый,

Вы можете перебирать каждый элемент, используя цикл 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

1 голос
/ 22 апреля 2009

Хмммм

Я прочитал это и это , и сейчас все спокойно;

На самом деле я могу преобразовать генераторы в список, просто выполнив

mylist=list(myGenerator)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...