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

В чем разница между итерацией и итератором?

1.6 Junior🔥 191 комментариев
#Python Core

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

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

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

Разница между итерацией и итератором

Итерация и итератор — два связанных, но разных концепции в Python. Итерация — это процесс перебора элементов, а итератор — это объект, который реализует этот процесс.

Итерация (Iteration)

Итерация — это процесс последовательного перебора элементов последовательности (списка, строки, словаря и т.д.).

# Итерация по списку
for item in [1, 2, 3, 4, 5]:
    print(item)

# Итерация по строке
for char in "hello":
    print(char)

# Итерация по словарю
for key in {"a": 1, "b": 2}:
    print(key)

Это просто процесс — движение от одного элемента к другому.

Итератор (Iterator)

Итератор — это объект, который реализует итерацию. Это объект, который помнит свою позицию в последовательности и может возвращать следующий элемент.

Требования для итератора:

  1. Метод __iter__() — возвращает сам итератор
  2. Метод __next__() — возвращает следующий элемент или вызывает StopIteration
# Пример итератора
class CountUp:
    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  # конец итерации

# Использование
iterator = CountUp(3)
print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
# print(next(iterator))  # StopIteration

Итерируемый (Iterable) vs Итератор (Iterator)

Это разные концепции, важно их различать:

АспектИтерируемый (Iterable)Итератор (Iterator)
ОпределениеОбъект с методом __iter__()Объект с __iter__() и __next__()
Метод iter()Возвращает итераторВозвращает сам себя
Метод next()Не имеетИмеет __next__()
СостояниеНе имеет позицииИмеет позицию в последовательности
ПримерыСписок, строка, словарьiter(список), файл
# Список — это итерируемый, но не итератор
my_list = [1, 2, 3]

print(hasattr(my_list, '__iter__'))    # True
print(hasattr(my_list, '__next__'))    # False

# Итератор списка
iterator = iter(my_list)
print(hasattr(iterator, '__iter__'))    # True
print(hasattr(iterator, '__next__'))    # True

print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3

Встроенные Итераторы

iter() — получить итератор из итерируемого:

my_list = ['a', 'b', 'c']
iterator = iter(my_list)  # создаем итератор

print(next(iterator))  # 'a'
print(next(iterator))  # 'b'
print(next(iterator))  # 'c'
# next(iterator)  # StopIteration

next() — получить следующий элемент:

my_string = "hello"
iterator = iter(my_string)

while True:
    try:
        char = next(iterator)
        print(char)
    except StopIteration:
        break

Как Работает for Цикл

for цикл использует итератор под капотом:

# Это:
for item in [1, 2, 3]:
    print(item)

# На самом деле работает так:
iterable = [1, 2, 3]
iterator = iter(iterable)      # __iter__()

while True:
    try:
        item = next(iterator)   # __next__()
        print(item)
    except StopIteration:
        break

Практический Пример: Кастомный Итератор

class FibonacciIterator:
    """Итератор для последовательности Фибоначчи"""
    
    def __init__(self, limit):
        self.limit = limit
        self.a = 0
        self.b = 1
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.a < self.limit:
            result = self.a
            self.a, self.b = self.b, self.a + self.b
            return result
        else:
            raise StopIteration

# Использование
fib = FibonacciIterator(100)

for number in fib:
    print(number, end=' ')  # 0 1 1 2 3 5 8 13 21 34 55 89

Генераторы (Generators)

Генератор — это простой способ создать итератор используя функцию с yield:

# Вместо класса с __iter__ и __next__
def fibonacci(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

# Использование (работает как итератор!)
for number in fibonacci(100):
    print(number, end=' ')  # 0 1 1 2 3 5 8 13 21 34 55 89

# Можно также использовать next()
gen = fibonacci(100)
print(next(gen))  # 0
print(next(gen))  # 1
print(next(gen))  # 1

Ленивое Вычисление (Lazy Evaluation)

Одно из преимуществ итераторов и генераторов — ленивое вычисление. Элементы вычисляются только когда они требуются:

# Список — все элементы в памяти
my_list = [x ** 2 for x in range(1000000)]
print(my_list[0])  # занимает много памяти

# Генератор — вычисляет по требованию
my_gen = (x ** 2 for x in range(1000000))
print(next(my_gen))  # вычисляет только первый элемент

# Экономит памяти!
print(len(list(my_list)))  # список требует много памяти
print(sum(1 for _ in my_gen))  # генератор экономит память

Встроенные Функции для Работы с Итераторами

# map() — применить функцию к каждому элементу
numbers = [1, 2, 3, 4, 5]
squares = map(lambda x: x ** 2, numbers)  # возвращает итератор
print(list(squares))  # [1, 4, 9, 16, 25]

# filter() — отфильтровать элементы
data = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, data)  # возвращает итератор
print(list(evens))  # [2, 4, 6]

# zip() — объединить несколько последовательностей
a = [1, 2, 3]
b = ['a', 'b', 'c']
paired = zip(a, b)  # возвращает итератор
print(list(paired))  # [(1, 'a'), (2, 'b'), (3, 'c')]

# enumerate() — индекс + значение
for index, value in enumerate(['a', 'b', 'c']):
    print(f"{index}: {value}")

Различия в Памяти и Производительности

import sys

# Список
my_list = [x for x in range(10000)]
print(f"Размер списка: {sys.getsizeof(my_list)} байт")

# Генератор
def my_generator():
    for x in range(10000):
        yield x

gen = my_generator()
print(f"Размер генератора: {sys.getsizeof(gen)} байт")

# Генератор занимает намного меньше памяти!

Заключение

Итерация — это процесс перебора элементов, а итератор — это объект, который реализует этот процесс. Итератор имеет методы __iter__() и __next__(), позволяющие последовательно получать элементы. Генераторы — удобный способ создать итератор. Правильное использование итераторов улучшает производительность и экономит память, особенно при работе с большими объемами данных.