Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое итерационный протокол
Итерационный протокол — это соглашение в Python, которое позволяет объекту быть использованным в цикле for. Объект должен реализовать два метода: __iter__() и __next__().
Основные компоненты
Итерируемый объект (Iterable) — реализует __iter__():
class MyIterable:
def __init__(self, data):
self.data = data
def __iter__(self):
return iter(self.data) # Возвращает итератор
Итератор (Iterator) — реализует __iter__() и __next__():
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self # Итератор возвращает сам себя
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
Как это работает
# Когда ты пишешь:
for item in my_list:
print(item)
# Python делает:
iterator = my_list.__iter__() # Создаёт итератор
while True:
try:
item = iterator.__next__() # Получает следующий элемент
print(item)
except StopIteration: # Когда элементы закончились
break
Практические примеры
Создание кастомного итератора:
class CountUp:
def __init__(self, max):
self.max = max
self.current = 0
def __iter__(self):
return self
def __next__(self):
self.current += 1
if self.current > self.max:
raise StopIteration
return self.current
for num in CountUp(5):
print(num) # 1, 2, 3, 4, 5
Итератор по диапазону:
class Range:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current >= self.end:
raise StopIteration
value = self.current
self.current += 1
return value
for num in Range(1, 4):
print(num) # 1, 2, 3
Генераторы — упрощённый способ
Генератор — это функция с yield, которая автоматически реализует итерационный протокол:
def my_range(start, end):
current = start
while current < end:
yield current
current += 1
for num in my_range(1, 4):
print(num) # 1, 2, 3
# Эквивалентно классу выше, но проще и понятнее
Best Practices
- Используй встроенные типы — они уже итерируемые
- Используй генераторы вместо классов — проще
- Различай Iterable и Iterator — первый требует
__iter__(), второй__iter__()и__next__()
Итерационный протокол — фундамент for циклов в Python.