Использование return (list) и yield - PullRequest
0 голосов
/ 22 октября 2019

Я создал два метода перечисления, один из которых возвращает список, а другой возвращает доход / генератор:

def enum_list(sequence, start=0):
    lst = []
    num = start
    for sequence_item in sequence:
        lst.append((num, sequence_item))
        num += 1
    return lst


def enum_generator(sequence, start=0):
    num = start
    for sequence_item in sequence:
        yield (num, sequence_item)
        num += 1

Несколько вопросов по этому поводу:

(1)Изменить список на генератор так же просто, как сделать:

# build via list
l = list()
for item in items:
    l.append(item)

# build via iterator
# l = list() (1) <== delete this line
for item in items:
    yield item # (2) change l.append(...) to yield ...

(2) Является ли «ленивая оценка» единственной причиной использования генератора, или есть и другие причины?

Ответы [ 2 ]

1 голос
/ 22 октября 2019
Генератор

(1) просто создается как добавление yield к вашей итерации.

(2) Да, для ленивой оценки. Но генераторы также используются для создания стека и очереди, поскольку они могут повторяться только один раз. Это свойство также используется в менеджере контекста, давая контекст.

0 голосов
/ 22 октября 2019

Дополнительным отличием в вашем случае является то, что, поскольку список создается перед использованием , а генератор вычисляется при каждом следующем вызове, функция генератора может проверять контекст и получать разные результаты для каждого выхода, в зависимости отвнешние условия, которые меняются со временем.

Рассмотрим псевдокод:

def alloted_time():
    while True:
         if len(global_queue)>10:
            yield 5
         else:
            yield 10

Если очередь большая, выделите 5 минут для следующего человека, иначе 10.

...