Что выведет этот код?


def generator():
    yield 1
    yield 2
    yield 3

gen = generator()
print(next(gen))
print(next(gen))

Разбор:

Функция generator() является генератором. Генераторы в Python - это функции, которые используют ключевое слово yield для возврата значений по одному за раз. В отличие от обычных функций, генераторы не выполняются до конца сразу, а "приостанавливаются" после каждого yield и возобновляются при следующем вызове next().

Выполнение кода:

  1. gen = generator(): Создается объект генератора gen. Сама функция generator() еще не выполняется.
  2. print(next(gen)): Вызывается функция next() для генератора gen. Функция generator() начинает выполняться до первого yield 1. Значение 1 возвращается и выводится на экран.
  3. print(next(gen)): Снова вызывается next() для gen. Функция generator() возобновляет выполнение с точки, где она была приостановлена (после yield 1). Она выполняется до yield 2. Значение 2 возвращается и выводится на экран.

Вывод:

1
2

Объяснение кода:

Данный код демонстрирует работу генератора в Python. Генератор - это специальный вид итератора, который позволяет создавать последовательность значений "лениво", то есть по требованию, а не сразу все целиком. Это особенно полезно при работе с большими объемами данных, когда хранить все данные в памяти нецелесообразно.

Функция generator() определена с использованием ключевого слова yield. Каждый раз, когда встречается yield, функция приостанавливает свое выполнение и возвращает указанное значение. При следующем вызове функции (через next()), выполнение возобновляется с того места, где оно было приостановлено.

Разбор кода построчно:

  1. def generator(): - Определяет функцию-генератор с именем generator.
  2. yield 1 - При первом вызове генератора (через next()), он вернет значение 1.
  3. yield 2 - При втором вызове генератора, он вернет значение 2.
  4. yield 3 - При третьем вызове генератора, он вернет значение 3. После этого, если попытаться вызвать next(gen) снова, возникнет исключение StopIteration, поскольку больше значений для генерации нет.
  5. gen = generator() - Создает экземпляр генератора, присваивая его переменной gen. Важно понимать, что на этом этапе функция generator() еще не выполняется. Она будет выполняться только при вызове next(gen).
  6. print(next(gen)) - Вызывает функцию next() для генератора gen. Это приводит к выполнению кода в функции generator() до первого ключевого слова yield. Значение 1 возвращается и выводится на экран.
  7. print(next(gen)) - Снова вызывает функцию next() для генератора gen. Выполнение возобновляется с того места, где оно было приостановлено (после yield 1). Код выполняется до следующего ключевого слова yield (yield 2). Значение 2 возвращается и выводится на экран.

Результат выполнения:

При выполнении этого кода на экране будет выведено следующее:

   
1
2
   
  

Дополнительные замечания:

  • Генераторы экономят память, поскольку генерируют значения только тогда, когда они необходимы.
  • Генераторы можно использовать в циклах for.
  • Функция генератора завершает работу, когда достигает конца функции или встречает оператор return. Если return имеет значение, то оно игнорируется. Если return не имеет значения, то он эквивалентен return None. В обоих случаях вызов next() после этого приведет к исключению StopIteration.
0