Что такое “объект генератора” в django?

В следующем запросе используется DISTINCT ON:

SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
FROM coach AS c
INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
WHERE c.year > 1999 
ORDER BY year, wins DESC

для возврата записей с наибольшим числом побед в год

year    wins    worldcupwin team
---------------------------------
2000    4       Y           a
2003    5       N           b

Фильтрация команд, которые не выиграть кубок мира:

SELECT year, team
FROM (
   SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
   FROM coach AS c
   INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
   WHERE c.year > 1999 
   ORDER BY year, wins DESC) AS t
WHERE t.worldcupwin = 'Y'       
ORDER BY year, wins DESC

дает ожидаемый результат:

year    team
-------------
2000    a

Демо здесь

5
задан Vebjorn Ljosa 28 September 2010 в 00:50
поделиться

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/

20
ответ дан 18 December 2019 в 05:55
поделиться

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

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

7
ответ дан 18 December 2019 в 05:55
поделиться

Hmmmm

I've read this and this and things are quiet clear now;

Actually i can convert generators to list by just doing

mylist=list(myGenerator)
1
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: