Вопрос №36
Осталось:
Что такое итераторы и протокол итерации?
Образцовый ответ
Показывать ответ по умолчанию
Итератор — это объект, который возвращает элементы по одному через метод __next__() и сигнализирует об окончании через исключение StopIteration.
Протокол итерации:
- __iter__() — возвращает сам итератор.
- __next__() — возвращает следующий элемент или выбрасывает StopIteration.
Как работает цикл for:
# Что делает for под капотом nums = [1, 2, 3] # for num in nums: # print(num) # Эквивалент: iterator = iter(nums) # Вызывает nums.__iter__() while True: try: num = next(iterator) # Вызывает iterator.__next__() print(num) except StopIteration: break
Создание своего итератора:
class Countdown: def __init__(self, start): self.current = start def __iter__(self): return self def __next__(self): if self.current <= 0: raise StopIteration value = self.current self.current -= 1 return value for num in Countdown(5): print(num) # 5, 4, 3, 2, 1
Встроенные итерируемые объекты:
- list, tuple, str, dict, set — итерируемые (имеют __iter__).
- range(), map(), filter(), zip() — возвращают итераторы.
- Итератор можно пройти только один раз, а итерируемый объект можно проходить многократно.
На практике:
Протокол итерации лежит в основе циклов for, генераторов и многих встроенных функций. Собственные итераторы полезны, когда нужно обрабатывать данные порциями — например, читать большой файл построчно вместо загрузки целиком.
