← Назад к вопросам

Какой метод отвечает за создание итератора в Python?

1.0 Junior🔥 251 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI21 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Итераторы в Python

Метод, отвечающий за создание итератора, — это iter(). Он должен возвращать объект итератора (самого себя или другой объект), который реализует метод next().

Основной протокол

Протокол итератора в Python состоит из двух методов:

  1. iter() — возвращает объект итератора (обычно self)
  2. 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循环 и другими инструментами обхода последовательностей.