📦 Репозиторий занятия 16

Урок 16. Цикл for

Как работать с репозиторием

Каждая карточка говорит, о чём файл, что он выводит и что в нём искать. Код виден прямо здесь: его можно скопировать одной кнопкой, скачать файл или открыть его целиком.

Маршрут изучения

  1. Прочитайте описание: по нему уже понятно, о чём файл и что он выведет.
  2. Предскажите вывод: сравните своё предположение со строкой «Что выводит».
  3. Запустите: скачайте файл или скопируйте код кнопкой и выполните его у себя.
  4. Измените: поменяйте одно условие или значение и объясните новый результат.

Файлы: рекомендуемый порядок

1
MarkdownРазбор концепции29 строк

Что такое итерируемый объект (iterable)

less_09__for__nested_loops__range/theory_01__what_is_iterable.md

Даёт два определения итерируемого объекта: строгое (объект с __iter__() или __getitem__(), который можно передать в iter()) и простое универсальное («объект, способный возвращать по одному своему элементу за раз» — цитата из глоссария Python). Показывает практическую проверку через isinstance(obj, Iterable) из typing на примере int (не итерируем) и str (итерируем).

  • Строгое определение: __iter__() / __getitem__() и функция iter()
  • Простое определение из глоссария Python: возвращает элементы по одному
  • from typing import Iterable
  • isinstance(digits, Iterable) == False для int
  • isinstance(num_str, Iterable) == True для str
Показать начало файла (29 строк всего)
## Что такое "итерируемый объект" (`iterable`) ?

### Строгое (но непонятное) определение:

Итерируемый объект (`iterable`) — это объект,  
у которого есть метод `__iter__()` или метод `__getitem__()` (с индексами, начиная с 0).  
Такой объект можно передать в функцию `iter()`, чтобы получить итератор.

Это определение подходит исключительно к Python, поскольку у других языков
программирования используются иные механизмы итерации.

### Простое и универсальное определение итерируемого объекта (`iterable`):

[*An object capable of returning its members one at a time.*](https://docs.python.org/3/glossary.html#term-iterable)

**Объект, способный возвращать по одному своему элементу за раз.**


## Как убедиться, что объект итерируемый ?

```python
from typing import Iterable

digits = 123456789
num_str = "123456789"

print(isinstance(digits, Iterable))
print(isinstance(num_str, Iterable))
```
Проверьте себя: Почему число 123456789 не является iterable, хотя состоит из «отдельных цифр», а его строковое представление '123456789' — является?
2
MarkdownРазбор концепции179 строк

Цикл for: базовый синтаксис, break/continue, вложенность и else

less_09__for__nested_loops__range/theory_02__for_loop.md

Открывается прямым сравнением с while — for перебирает элементы iterable, а не проверяет условие. Разбирает break/continue на примерах с range(), вложенные циклы (break и continue во вложенном цикле прерывают только свой уровень, не внешний), и блок else — выполняется только при естественном завершении без break, с показательным примером поиска буквы в слове. Завершается сводной таблицей «когда использовать for, а когда while».

  • for char in "Python": — простейший перебор строки
  • break и continue в for на примере range(1, 6)
  • Вложенные циклы: for i ... for j ... — таблица пар (i, j)
  • break/continue во вложенном цикле прерывает только свой уровень
  • else при for — выполняется только без break, пример поиска буквы в слове
  • Таблица сравнения for и while: когда что использовать
Показать начало файла (179 строк всего)
# Цикл `for` в Python

## 1. Отличие от `while`

* Цикл `while` повторяет блок кода, пока условие истинно.
* Цикл `for` перебирает элементы итерируемого объекта (`iterabe`).

---

## 2. Простейший цикл `for`

```python
for char in "Python":
    print(char, end="-")
    
# P-y-t-h-o-n-
print("\b")
# P-y-t-h-o-n
```

---

## 3. Объект `range`


[Подробности...](./theory_03__range.md)


---

## 4. `break` и `continue`

* `break` прерывает весь цикл полностью.
* `continue` переходит к следующей итерации, пропуская оставшийся код в теле цикла.

Пример с `break`:

```python
for num in range(1, 6):
    if num == 3:
        break
    print(num, end=" ")

# 1 2 
```

Пример с `continue`:

```python
for num in range(1, 6):
    if num == 3:
        continue
    print(num, end=" ")

# 1 2 4 5 
```

Кстати, явный плюс `for` по сравнению с циклом `while`: 
- при использовании `continue` не надо думать о месте счётчика в теле цикла.

…
Проверьте себя: В примере поиска буквы 'a' в слове 'reconstruction' — почему сработает именно блок else, а не break, и что изменится, если искать букву 'c'?
3
MarkdownРазбор концепции95 строк

Объект range(): последовательность чисел без хранения в памяти

less_09__for__nested_loops__range/theory_03__range.md

Объясняет, что range() — не список, а итерируемый объект, вычисляющий числа на лету, что экономит память. Разбирает три формы вызова (stop / start, stop / start, stop, step) на примерах, включая отрицательный шаг для обратного отсчёта, явное преобразование в список через list(range(5)) и проверку вхождения числа через in без превращения в список.

  • range(stop), range(start, stop), range(start, stop, step) — три формы
  • range(5) → 0 1 2 3 4, range(2, 5) → 2 3 4
  • range(0, 10, 2) — шаг 2, range(5, 0, -1) — отрицательный шаг
  • list(range(5)) — явное преобразование в список
  • range не хранит числа в памяти — хранит только start/stop/step
  • 3 in range(10) == True — проверка вхождения без материализации
Показать начало файла (95 строк всего)

# Объект `range()`

## 1. Что это такое?

`range()` — это встроенный в Python **итерируемый объект**, который задаёт последовательность целых чисел.
Часто его называют «диапазоном чисел».

Он **не хранит** все числа в памяти сразу, а **вычисляет их по мере перебора** (это экономит память).

---

## 2. Синтаксис

```
range(stop)
range(start, stop)
range(start, stop, step)
```

* **`start`** — с какого числа начинать (по умолчанию `0`)
* **`stop`** — до какого числа идти (**не включая его**)
* **`step`** — шаг (по умолчанию `1`)

---

## 3. Примеры

### Только `stop`

```python
for i in range(5):
    print(i, end=" ")

# 0 1 2 3 4
```

---

### `start` и `stop`

```python
for i in range(2, 5):
    print(i, end=" ")

# 2 3 4 
```

---

### С шагом

```python
for i in range(0, 10, 2):
    print(i, end=" ")

# 0 2 4 6 8
```


…
Проверьте себя: Почему range(10) занимает в памяти примерно столько же места, что и range(10_000_000), хотя второй «содержит» в миллион раз больше чисел?