Смешивание функций и генераторов - PullRequest
1 голос
/ 04 марта 2020

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

Обычно я просто помещаю результаты в список и возвращаю список, но в этом случае результаты слишком велики (несколько сотен МБ на каждую l oop).

Я написал это, не задумываясь о это, ожидая, что Python's Dynami c печатает, чтобы понять вещи, но следующее всегда создается как генератор.

def mixed(is_generator=False):
    for i in range(5):
        # process some stuff including writing to a file
        if is_generator:
            yield i
    return

Из этого у меня есть два вопроса:

1) Присутствует ли ключевое слово yield в области видимости немедленно превращает объект в генератор?

2) Есть ли разумный способ получить поведение, которое я намеревался?

2.1) Если нет, то почему это невозможно? (С точки зрения того, как функции и генераторы работают в Python.)

1 Ответ

3 голосов
/ 04 марта 2020

Позволяет go шаг за шагом:

1) Превращает ли присутствие ключевого слова yield в области действия объект сразу в генератор? Да

2) Есть ли разумный способ получить то поведение, которое я намеревался? Да, см. Пример ниже

Дело в том, чтобы обернуть вычисление и вернуть либо генератор, либо список с данными этого генератора:

def mixed(is_generator=False):
    # create a generator object
    gen = (compute_stuff(i) for i in range(5))
    # if we want just the generator
    if is_generator:
        return gen
    # if not we consume it with a list and return that list
    return list(gen)

В любом случае, я бы сказал, что это плохая практика. Вы должны отделить его, обычно просто иметь функцию генератора, а затем использовать какую-то логи c снаружи:

def computation():
    for i in range(5):
        # process some stuff including writing to a file
        yield i

gen = computation()
if lazy:
    for data in gen:
        use_data(data)
else:
    data = list(gen)
    use_all_data(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...