Задать вопрос
@nevro
не пойми кто

2 примера: генератор списка и yield — разницы не видно. Некорректные примеры?

1. Генератор списка:
gen_list = (x*x for x in range(3))

for i in gen_list:
    print(i)

0
1
4


2. yield:
def gen_list():
    lis = range(3)
    for i in lis:
        yield i*i

my_list = gen_list()
for i in my_gen:
    print(i)

0
1
4


P.S.
1. Идею генераторов понимаю - хранить в памяти только текущий сгенерированный элемент, т.е. обратиться по индексу к предыдущему невозможно. С yield так же.
2. Список - объект. yield весь код функции превращает так же в объект (хотя функция - и так объект... видимо, не итерируемый).

Вот и не пойму смысл этого наворота над генератором списков.
  • Вопрос задан
  • 998 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@deliro
В добавок к ответу Pavel Denisov вброшу такой вариант:
def forever(lst):
    while True:
        for item in lst:
            yield item

Будет йелдить бесконечно элементы списка, если список закончится - заново. Генератором генератора (generator comprehension) такого не добьёшься. В общем, generator comprehension - это как лямбды. Сокращённая запись для удобства, ведь намного удобнее и нагляднее написать
','.join(str(x) for x in lst)
Чем
def str_gen(lst):
    for item in lst:
        yield str(item)

','.join(str_get(lst))

Хотя, суть одна.
Но некоторые вещи обычным generator comprehension не реализовать.

P.S. Генератор списков создаёт список. Это вот так: [x**2 for x in range(5)]
Ответ написан
@lega
В данном случае, генератор списков - это по сути частный случай yield.

yield позволяет множественный вход и выход из функции, это позволяет делать разные возможности, например потоковая передача данных или "корутины" для асинхронных приложений.
Ответ написан
Комментировать
@Sollar_MOD
Программист самоучка (по книгам то есть)
все именно так, функции-генераторы отличаются тем, что более гибки. Генераторные выражения вида (x**2 for x in range(5)) это лишь упрощенная запись функции-генератора для использования в простых случаях ( не путать с генераторами списков: [x**2 for x in range(5)]. Отличие лишь в скобках, а смысл совершенно разный, ведь генераторные выражения выдают значения на ходу, генератор списков заранее создает весь список, и уже потом выдает его значения как iterable).
Ответ написан
@abcd0x00
Вот пример генератора через функцию
>>> def g():
...     while True:
...         yield 'a'
...         yield 'b'
...         yield 'c'
... 
>>> list(zip(g(), range(10)))
[('a', 0), ('b', 1), ('c', 2), ('a', 3), ('b', 4), ('c', 5), ('a', 6), ('b', 7), ('c', 8), ('a', 9)]
>>>

Функция даёт больше возможностей для формирования более гибких генераторов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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