Итераторы и генераторы
Ленивая обработка данных — без необходимости держать всё в памяти.
Итераторы и генераторы
Что это
Генератор — функция со словом 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) тоже одноразовый.