Python Schoolby trefilov
Шаг 1 из 5+110 XP

Итераторы и генераторы

Ленивая обработка данных — без необходимости держать всё в памяти.

Итераторы и генераторы

Что это

Генератор — функция со словом yield вместо return. Она не возвращает значение сразу, а отдаёт его «по запросу» при каждом обращении. Состояние (локальные переменные, позиция в коде) сохраняется между обращениями. Итог: можно описать бесконечную последовательность и брать только то, что нужно.

Как читается

def countdown(n):
    while n > 0:
        yield n
        n -= 1

print(list(countdown(3))) # [3, 2, 1]

- Каждый yield приостанавливает функцию и отдаёт значение наверх.
- При следующем шаге выполнение продолжается со следующей строки после yield.
- list(...) исчерпывает генератор, собирая всё в список.

Пример

def read_lines(path):
    with open(path) as f:
        for line in f:
            yield line.rstrip()

Читаем гигабайтный файл, не кладя его в память:

for line in read_lines("big.log"): if "ERROR" in line: print(line)

Когда использовать / подводные камни

👍 Большие/бесконечные потоки данных, пайплайны (логи, JSONL, CSV построчно).
👎 Генератор одноразовый — после прохода в нём ничего нет. Если нужно итерировать дважды — используй list() или функцию-фабрику. И учти: generator expression (x*2 for x in r) тоже одноразовый.