Что такое "генератор объекта" в Django?

Я использую пакет для голосования 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 ответа

Если вы хотите список, просто вызовите 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/

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

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

Хммм

Я читал это и это, и сейчас все ясно;

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

mylist=list(myGenerator)
Другие вопросы по тегам