← Назад ко всем вопросам

Три способа создать генератор

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

1. Функция с ключевым словом yield

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

def count_up_to(max):
    count = 1
    while count <= max:
        yield count  # Возвращает текущее значение count и сохраняет состояние функции
        count += 1  # Увеличивает count на 1
  • def count_up_to(max): — определяет функцию, которая принимает максимальное значение.
  • count = 1 — инициализирует переменную count с начальным значением 1.
  • while count <= max: — цикл продолжается, пока count не превысит max.
  • yield count — возвращает текущее значение count и приостанавливает выполнение функции.
  • count += 1 — увеличивает значение count на 1.

2. Генераторные выражения

Генераторные выражения похожи на списковые включения, но создают генераторы. Они заключены в круглые скобки и позволяют создавать генераторы в одну строку.

squares = (x * x for x in range(10))
  • (x * x for x in range(10)) — создает генератор, который вычисляет квадрат каждого числа от 0 до 9.
  • squares — переменная, которая хранит ссылку на генератор.

3. Встроенные функции и пользовательские классы

Можно создать генератор, используя встроенные функции, такие как iter(), в сочетании с пользовательскими классами, которые реализуют метод __iter__() и __next__().

class Countdown:
    def __init__(self, start):
        self.current = start
​
    def __iter__(self):
        return self  # Возвращает сам объект как итератор
​
    def __next__(self):
        if self.current <= 0:
            raise StopIteration  # Останавливает итерацию, когда current <= 0
        else:
            self.current -= 1  # Уменьшает current на 1
            return self.current  # Возвращает текущее значение current
​
countdown = Countdown(5)
for number in countdown:
    print(number)
  • class Countdown: — определяет класс Countdown.
  • def __init__(self, start): — инициализирует объект с начальным значением start.
  • def __iter__(self): — возвращает сам объект как итератор.
  • def __next__(self): — определяет логику получения следующего элемента.
  • raise StopIteration — сигнализирует об окончании итерации.
  • countdown = Countdown(5) — создает объект Countdown, начиная с 5.
  • for number in countdown: — перебирает элементы генератора, печатая их.

Тема: Python
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки