СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Методическая разработка «Протокол итератора в Python»

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Методическая разработка «Протокол итератора в Python»»

МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ

«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»













Методическая разработка

«Протокол итератора в 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__?