МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ
«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»
Методическая разработка
«Протокол итератора в Python»
к дополнительной общеобразовательной
общеразвивающей программе
технической направленности
«Программирование на Python»
Возраст детей: 10-17 лет
Автор: Костычев Вадим Александрович
г. Заречный Пензенской области
2026 г.
Данный материал предназначен для преподавателей информатики, программирования и студентов (учащихся), изучающих язык программирования Python. Он может быть использован как на лекциях, так и при проведении практических занятий или самостоятельной работе.
Цель: сформировать у учащихся чёткое понимание разницы между итерацией, итерируемым объектом и итератором, а также научить реализовывать протокол итератора с помощью магических методов __iter__ и __next__.
Задачи:
1. Объяснить ключевые термины: итерация, итерируемый объект, итератор.
2. Показать, как Python определяет, является ли объект итерируемым.
3. Научить реализовывать итерируемые объекты через __iter__ или __getitem__.
4. Продемонстрировать создание собственного итератора с использованием __iter__ и __next__.
5. Разобрать два подхода: когда объект сам является итератором и когда итератор вынесен в отдельный класс.
Основные понятия
Итерация — это процесс повторного выполнения действий. В Python она чаще всего используется для перебора элементов в коллекциях:
for i in range(3):
print("Привет!") # Итерация: повтор 3 раза
Итерируемый объект (iterable) – это объект, по которому можно пройтись в цикле for. Примеры: str, list, tuple, set, dict.
Чтобы объект стал итерируемым, он должен:
- иметь метод __iter__(), или
- иметь метод __getitem__() с целочисленными индексами.
Функция iter(obj) пытается вызвать obj.__iter__(). Если его нет — ищет obj.__getitem__.
Итератор (iterator) – это объект, который:
- умеет возвращать по одному элементу за раз,
- реализует метод __next__(),
- выбрасывает StopIteration, когда элементы закончились.
Итератор сам по себе является итерируемым, потому что имеет метод __iter__(), возвращающий self.
Как работает цикл for «под капотом»?
Код:
for x in [1, 2, 3]:
print(x)
На самом деле выполняется так:
it = iter([1, 2, 3]) # Получаем итератор
while True:
try:
x = next(it) # Вызываем __next__()
print(x)
except StopIteration:
break # Выходим, когда элементы кончились
Цикл for автоматически обрабатывает StopIteration.
Делаем свой класс итерируемым
Способ 1: через __iter__
class Student:
def __init__(self, name, surname):
self.name = name
self.surname = surname
def __iter__(self):
return iter(self.surname) # Возвращаем итератор строки
s = Student("Анна", "Петрова")
for char in s:
print(char) # Печатает: П е т р о в а
Здесь Student — итерируемый объект, но не итератор.
Способ 2: через __getitem__
class Digits:
def __init__(self, number):
self.digits = list(str(number))
def __getitem__(self, index):
return self.digits[index]
d = Digits(123)
for digit in d:
print(digit) # 1, 2, 3
Python автоматически создаёт итератор, вызывая __getitem__(0), __getitem__(1) и т.д.
Создаём собственный итератор
Чтобы объект сам был итератором, он должен реализовывать оба метода:
- __iter__(self) → возвращает self
- __next__(self) → возвращает следующий элемент или вызывает StopIteration
Пример: перебор имени и фамилии по буквам
class Student:
def __init__(self, name, surname):
self.full_name = name + " " + surname
self.index = 0
def __iter__(self):
self.index = 0 # Сброс при новой итерации
return self
def __next__(self):
if self.index
char = self.full_name[self.index]
self.index += 1
return char
else:
raise StopIteration
s = Student("Иван", "Сидоров")
for c in s:
print(c) # И в а н С и д о р о в
Без __iter__, возвращающего self, объект не будет работать в for, даже если есть __next__.
Итератор в отдельном классе
Иногда логичнее вынести итератор в отдельный класс — особенно если итерация сложная или возможны разные способы обхода.
Пример: счётчик от low до high
class Counter:
def __init__(self, low, high):
self.low = low
self.high = high
def __iter__(self):
return CounterIterator(self.low, self.high)
class CounterIterator:
def __init__(self, low, high):
self.current = low - 1
self.high = high
def __iter__(self):
return self # Обязательно!
def __next__(self):
self.current += 1
if self.current
return self.current
raise StopIteration
# Использование
for num in Counter(1, 3):
print(num) # 1, 2, 3
Такой подход соответствует принципу разделения ответственности:
- Counter — хранит данные,
- CounterIterator — управляет обходом.
Протокол итератора — формальное определение
Объект считается:
- итерируемым, если имеет __iter__() или __getitem__();
- итератором, если имеет __iter__() (возвращает self) и __next__().
Это неформальный протокол, но он строго соблюдается встроенным поведением Python.
Заключение
| Понятие | Что делает | Обязательные методы |
| Итерация | Процесс повторения | — |
| Итерируемый объект | Может быть использован в for | __iter__() или __getitem__() |
| Итератор | Возвращает элементы по одному | __iter__() → self, __next__() |
- Цикл for использует iter() и next() «за кулисами».
- Любой итератор — это итерируемый объект, но не наоборот.
- Реализация протокола итератора даёт полный контроль над процессом перебора.
- Итератор можно сделать либо внутри класса, либо вынести в отдельный класс.
Проверь себя
1. Чем итерируемый объект отличается от итератора?
2. Почему объект без __iter__ и __getitem__ нельзя использовать в for?
3. Зачем итератору нужен метод __iter__, возвращающий self?
4. Когда лучше выносить итератор в отдельный класс?
5. Что произойдёт, если в __next__ не вызвать StopIteration?
6. Как работает for «под капотом»?
7. Можно ли сделать объект итерируемым только через __next__?