Skip to content

Commit f6ac4c4

Browse files
committed
feat: add generator page
1 parent 1d9c5ee commit f6ac4c4

3 files changed

Lines changed: 52 additions & 2 deletions

File tree

docs/python/generator.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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 корректно завершаться.

docs/python/generator_expression.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

docs/python/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
Ленивые вычисления и работа с последовательностями.
5959

6060
- [yield](yield.md) — генераторы, ленивая генерация
61-
- [Generator expression](generator_expression.md) — синтаксис `(x for x in ...)`
61+
- [Generator expression](generator.md) — синтаксис `(x for x in ...)`
6262
- [Starred expression](starred_expression.md) — распаковка `*args`
6363

6464
---

0 commit comments

Comments
 (0)