Генераторы в Python: что это и зачем
Вопрос
Что такое генератор в Python и когда вы его применяете?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Функция с `yield` возвращает итератор, тело выполняется по `next`
Состояние замораживается между `yield`
Ленивость: элементы по требованию, экономия памяти
Генераторные выражения в круглых скобках
Применение: большие файлы, потоковая обработка, бесконечные последовательности, конвейеры
Одноразовость и отсутствие `len`
Что могут спросить следом
- Чем
yieldотличается отreturn? - Что будет при повторном обходе генератора?
- Как прочитать файл на 50 ГБ построчно?
Разбор
Образцовый ответ: «Генератор это функция, в теле которой есть yield. При вызове она не выполняется, а возвращает объект-генератор, это итератор. Каждый next() выполняет код до ближайшего yield, отдаёт значение и замораживает состояние функции: локальные переменные и место выполнения. Когда функция заканчивается, итерация прекращается через StopIteration. Главный плюс в ленивости: элементы считаются по требованию, и в памяти нет всей последовательности. Например, обработка лога на десятки гигабайт: генератор читает строку, фильтрует, отдаёт дальше, и память постоянная. Генераторы удобно складывать в конвейер: чтение, разбор, фильтр, islice первых N. Для простых случаев есть генераторные выражения в круглых скобках, их часто передают прямо в sum или any. Ограничения: генератор одноразовый, у него нет длины и индексов. Если данные нужны несколько раз, материализую в список».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Итераторы и генераторы»
- Когда выполняется тело генератора
- Разбить последовательность на пачки
- Рекурсивно развернуть вложенные списки
- Конвейер обработки лога на генераторах
- Свой итерируемый класс, который можно обходить много раз
- Когда выполняется finally в недочитанном генераторе
- Полезные функции itertools
- Ленивые вычисления