|
| 1 | +## Определение |
| 2 | + |
| 3 | +!!! info "" |
| 4 | + Генератор — это специальный тип функции, которая возвращает итератор. Она позволяет возвращать значения по одному, |
| 5 | + не сохраняя всю последовательность в памяти целиком. |
| 6 | + |
| 7 | +## Зачем нужны |
| 8 | + |
| 9 | +<span class="badge">Generators</span> — идеальный выбор для работы с огромными наборами данных или бесконечными потоками. |
| 10 | +Они реализуют принцип <span class="badge">lazy evaluation</span> (ленивых вычислений): следующее значение вычисляется только тогда, |
| 11 | +когда оно действительно потребовалось. Это экономит мегабайты оперативной памяти, так как в ней всегда находится только один текущий элемент. |
| 12 | + |
| 13 | +## Как работает |
| 14 | + |
| 15 | +Вместо ключевого слова <span class="badge">return</span> в генераторах используется <span class="badge">yield</span>. |
| 16 | +Когда выполнение доходит до <span class="badge">yield</span>, функция возвращает значение и «замораживается», сохраняя все свои локальные |
| 17 | +переменные и текущую позицию. При следующем вызове (через функцию next() или в цикле for) она продолжает работу ровно с того места, где остановилась. |
| 18 | + |
| 19 | +| Характеристика | Обычная функция | Генератор | |
| 20 | +|------------------|-------------------------------------------------------|------------------------------------------------------------------| |
| 21 | +| Выход из функции | <span class="badge">return</span> (завершает работу) | <span class="badge">yield</span> (пауза и сохранение состояния) | |
| 22 | +| Результат | Одно значение или список | Итератор (объект-генератор) | |
| 23 | +| Память | Хранит всё сразу в RAM | Вычисляет элементы на ходу | |
| 24 | + |
| 25 | +## Примеры |
| 26 | + |
| 27 | +```python |
| 28 | + # 1. Функция-генератор |
| 29 | + def count_up_to(max_val): |
| 30 | + count = 1 |
| 31 | + while count <= max_val: |
| 32 | + yield count # Здесь функция ставится на паузу |
| 33 | + count += 1 |
| 34 | + |
| 35 | + counter = count_up_to(3) |
| 36 | + print(next(counter)) # 1 |
| 37 | + print(next(counter)) # 2 |
| 38 | + |
| 39 | + # 2. Генераторное выражение (Generator Expression) |
| 40 | + # Работает как list comprehension, но в круглых скобках |
| 41 | + squares_gen = (x**2 for x in range(1000000)) |
| 42 | + |
| 43 | + # В памяти только "инструкция", а не миллион чисел |
| 44 | + print(next(squares_gen)) # 0 |
| 45 | +``` |
| 46 | + |
| 47 | +## Ключевые мысли |
| 48 | + |
| 49 | +- Генераторы позволяют обрабатывать данные, которые не влезают в оперативную память. |
| 50 | +- Состояние функции (локальные переменные) автоматически сохраняется между вызовами yield. |
| 51 | +- После того как все значения возвращены, генератор выбрасывает исключение StopIteration, что позволяет циклам for корректно завершаться. |
0 commit comments