0Pricing
Python Academy · Урок

Выражения-генераторы

Пишите компактные ленивые конвейеры

«Выражения-генераторы» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

От списочного включения к выражению-генератору

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

list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))

Разница в использовании памяти

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

import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))

Перебор выражения-генератора

Вы потребляете выражение-генератор так же, как любой итератор: с помощью цикла for, вызова next() или передачи его функции.

gen = (c.upper() for c in 'hello')
for ch in gen:
    print(ch)

Фильтрация с помощью if

Добавьте условие if, чтобы оставить только подходящие элементы, как в списочном включении.

evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))

Прямая передача функциям

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

total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)

Напоминание об однократном использовании

Выражение-генератор исчерпывается после одного прохода, как и функция-генератор. При второй попытке перебора оно ничего не выдаёт.

gen = (x for x in range(3))
print(list(gen))
print(list(gen))

Объединение выражений

Можно передать одно выражение-генератор другому и построить ленивый конвейер. Ничего не вычисляется, пока конечный потребитель не запросит значения.

nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))

any() и all()

Выражения-генераторы особенно полезны с any() и all(), поскольку эти функции могут завершить работу досрочно, как только ответ становится известен.

words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))

Вложенные циклы

Как и списочные включения, выражения-генераторы поддерживают несколько условий for, которые читаются слева направо.

pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))

Пример ленивого конвейера

Перед Вами небольшой конвейер обработки текста. Каждый этап работает лениво, поэтому очень большой файл можно обрабатывать потоково, не загружая его целиком.

lines = ['  alpha ', '', '  beta', 'gamma  ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))

Как сделать выбор

Используйте списочное включение, когда данные понадобятся несколько раз или потребуется доступ по индексу. Используйте выражение-генератор для потоковой обработки за один проход или для больших объёмов данных.

data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете выражения-генераторы.

Итоги

Вы изучили выражения-генераторы:

  • Круглые скобки позволяют получить ленивую альтернативу списочным включениям.
  • Они экономят память и поддерживают фильтры if и вложенные циклы.
  • Они хорошо сочетаются с sum, any, all и объединением в цепочки.
  • Их можно использовать только один раз.

Далее Вы узнаете, как объединять генераторы с помощью yield from.

Часто задаваемые вопросы

Урок «Выражения-генераторы» бесплатный?

Да — полный текст урока «Выражения-генераторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Выражения-генераторы»?

Пишите компактные ленивые конвейеры Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Выражения-генераторы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Протокол итератора
  2. Функции-генераторы
  3. Выражения-генераторы
  4. yield from и делегирование
← Назад к Python Academy