В Python итерируемый объект — это любой объект, по которому можно пройтись в цикле for. Обычно это списки, строки, словари… но вы можете создать свой собственный!
👇 Секрет — метод `__getitem__`
Если ваш класс поддерживает доступ по индексам (`obj[0]`, obj[1] и т.д.), Python автоматически сможет итерироваться по нему.
Пример: арифметическая последовательность
class ArithmeticSequence:
def __init__(self, start: int, step: int, total: int) -> None:
self.start = start
self.step = step
self.total = total
def __getitem__(self, index: int) -> int:
if not 0 <= index < self.total:
raise IndexError(f"Invalid index {index}.")
return self.start + index * self.step
Использование:
seq = ArithmeticSequence(5, 3, 6)
print(seq[3]) # 14
for value in seq:
print(value, end=", ")
# 5, 8, 11, 14, 17, 20,
💡 Почему это работает?
Python просто пытается вызывать __getitem__(0), __getitem__(1), `__getitem__(2)`…
И продолжает, пока не получит IndexError.
⚠️ Важно:
Если вы выбрасываете другую ошибку (например, `KeyError`), итерация сломается.
Пример неправильной реализации:
class DictWrapper:
def __init__(self, values):
self.values = values
def __getitem__(self, index):
return self.values[index]
Здесь Python не понимает, когда остановиться — и падает с ошибкой.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
