← Назад к вопросам
Какой метод отвечает за создание итератора в Python?
1.0 Junior🔥 251 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI21 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Итераторы в Python
Метод, отвечающий за создание итератора, — это iter(). Он должен возвращать объект итератора (самого себя или другой объект), который реализует метод next().
Основной протокол
Протокол итератора в Python состоит из двух методов:
- iter() — возвращает объект итератора (обычно self)
- next() — возвращает следующий элемент или raises StopIteration
class MyIterator:
def __init__(self, max):
self.max = max
self.current = 0
def __iter__(self):
return self # возвращаем сам итератор
def __next__(self):
if self.current < self.max:
self.current += 1
return self.current
else:
raise StopIteration # сигнал конца итерации
# Использование
for num in MyIterator(3):
print(num) # 1, 2, 3
Разница между итерируемым объектом и итератором
Итерируемый объект (iterable):
- Имеет метод iter(), который возвращает итератор
- Примеры: list, tuple, dict, string, set
my_list = [1, 2, 3]
iterator = iter(my_list) # вызывает __iter__() и возвращает итератор
Итератор (iterator):
- Имеет методы iter() и next()
- iter() возвращает сам себя
- next() возвращает следующий элемент
Генераторы — упрощённый способ
Генератор — это функция, которая использует yield. Она автоматически реализует iter() и next():
def my_generator(max):
current = 0
while current < max:
current += 1
yield current
# Использование — абсолютно идентично MyIterator
for num in my_generator(3):
print(num) # 1, 2, 3
Генератор — это объект итератора, созданный функцией с yield.
Встроенная функция iter()
Функция iter(obj) вызывает метод iter() объекта:
my_list = [1, 2, 3]
iterator = iter(my_list)
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
print(next(iterator)) # StopIteration exception
Функция next(iterator) вызывает метод next() итератора.
Практический пример — кастомный итератор
class RangeIterator:
def __init__(self, start, end, step=1):
self.current = start
self.end = end
self.step = step
def __iter__(self):
return self
def __next__(self):
if self.current < self.end:
value = self.current
self.current += self.step
return value
else:
raise StopIteration
# Использование
for num in RangeIterator(0, 5, 2):
print(num) # 0, 2, 4
Бесконечный генератор
def infinite_counter():
n = 0
while True:
yield n
n += 1
counter = infinite_counter()
print(next(counter)) # 0
print(next(counter)) # 1
print(next(counter)) # 2
# ... может работать бесконечно
Важные моменты
- Итератор можно использовать только один раз — после StopIteration он исчерпан
- Генераторы экономят память, так как вычисляют значения лениво (lazy evaluation)
- Любое итерируемое можно превратить в итератор через iter()
- iter() — ключевой метод для поддержки цикла for
Это фундаментальный протокол Python, который позволяет работать с for循环 и другими инструментами обхода последовательностей.