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

От чего вызывается функция next в Python?

1.8 Middle🔥 181 комментариев
#Python Core

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

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

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

# От чего вызывается функция next в Python?

Функция next() в Python вызывается от итератора (iterator). Она получает следующий элемент из итератора и является фундаментальной частью итерационного протокола Python.

Основной концепт: Итератор и Итерируемый объект

Важно различать два понятия:

Итерируемый объект (Iterable)

Это объект, который имеет метод __iter__(), возвращающий итератор:

# Список — итерируемый объект
numbers = [1, 2, 3]
print(hasattr(numbers, '__iter__'))  # True

# Строка — итерируемый объект
text = "hello"
print(hasattr(text, '__iter__'))  # True

# Словарь — итерируемый объект
data = {'a': 1, 'b': 2}
print(hasattr(data, '__iter__'))  # True

Итератор (Iterator)

Это объект, который имеет два метода:

  • __iter__() — возвращает сам себя
  • __next__() — возвращает следующий элемент или вызывает StopIteration
# Создаем итератор из списка
numbers = [1, 2, 3]
iterator = iter(numbers)  # Вызовем __iter__()

print(hasattr(iterator, '__next__'))  # True
print(hasattr(iterator, '__iter__'))  # True

Как работает next()

Функция next() вызывает метод __next__() итератора:

# Простой пример
numbers = [1, 2, 3]
iterator = iter(numbers)

print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
print(next(iterator))  # Вызовет StopIteration (конец итератора)

Когда итератор исчерпан, вызывается исключение StopIteration:

numbers = [1, 2]
iterator = iter(numbers)

next(iterator)  # 1
next(iterator)  # 2
next(iterator)  # StopIteration ❌

# Правильный способ обработки
try:
    next(iterator)
except StopIteration:
    print("Итератор исчерпан")

next() с параметром по умолчанию

Функция next() может принимать второй аргумент — значение по умолчанию:

numbers = [1, 2]
iterator = iter(numbers)

next(iterator)  # 1
next(iterator)  # 2
next(iterator, "конец")  # Возвращает "конец" вместо StopIteration

Это очень удобно для безопасной работы с итераторами:

# Без значения по умолчанию
data = [1, 2]
iterator = iter(data)
try:
    next(iterator)
    next(iterator)
    value = next(iterator)  # ❌ StopIteration
except StopIteration:
    value = None

# С значением по умолчанию
data = [1, 2]
iterator = iter(data)
next(iterator)
next(iterator)
value = next(iterator, None)  # ✅ Вернет None

Создание собственного итератора

Когда вы создаете свой итератор, нужно реализовать оба метода:

class CountUp:
    """Итератор, считающий от 1 до n"""
    def __init__(self, max):
        self.max = max
        self.current = 1
    
    def __iter__(self):
        """Возвращает сам себя"""
        return self
    
    def __next__(self):
        """Возвращает следующий элемент или вызывает StopIteration"""
        if self.current <= self.max:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration

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

# Можно использовать в цикле
counter = CountUp(3)
for num in counter:
    print(num)  # 1, 2, 3

Генераторы — удобный способ создания итераторов

Генераторы — это функции, которые используют yield вместо return. Они автоматически создают итератор:

def count_up(max):
    """Генератор вместо класса итератора"""
    current = 1
    while current <= max:
        yield current
        current += 1

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

# Цикл for автоматически вызывает next()
for num in count_up(3):
    print(num)  # 1, 2, 3

Встроенные функции, работающие с итераторами

Много встроенных функций Python используют next() "под капотом":

# for цикл — использует next()
for item in [1, 2, 3]:
    print(item)  # Эквивалентно next() в цикле

# Распаковка
a, b, c = [1, 2, 3]  # Использует next()

# zip()
list1 = [1, 2]
list2 = ['a', 'b']
for num, char in zip(list1, list2):
    print(num, char)  # Вызывает next() для обоих итераторов

# map() и filter()
doubled = map(lambda x: x * 2, [1, 2, 3])  # Возвращает итератор
print(next(doubled))  # 2

# enumerate()
items = ['a', 'b', 'c']
enum = enumerate(items)
print(next(enum))  # (0, 'a')

Практический пример: обработка файла

# Файл — это итератор
with open('data.txt', 'r') as f:
    # Получить первую строку
    first_line = next(f)
    print(first_line)
    
    # Получить следующую строку
    second_line = next(f)
    print(second_line)
    
    # Обработать остаток
    for line in f:
        print(line)

# С значением по умолчанию
with open('data.txt', 'r') as f:
    line = next(f, "EOF")
    while line != "EOF":
        print(line)
        line = next(f, "EOF")

Протокол Iterator подробнее

Вот как Python интерпретирует код при использовании next():

# Это:
for item in container:
    print(item)

# Эквивалентно этому:
iterator = iter(container)  # Вызывает container.__iter__()
while True:
    try:
        item = next(iterator)  # Вызывает iterator.__next__()
        print(item)
    except StopIteration:
        break

Заключение

Функция next() вызывается от итератора и работает с ним по следующим правилам:

  1. Итератор — объект с методами __iter__() и __next__()
  2. next(iterator) — вызывает __next__() метод итератора
  3. StopIteration — исключение, сигнализирующее об окончании итератора
  4. next(iterator, default) — безопасный способ с значением по умолчанию
  5. Генераторы — удобный способ создания итераторов через yield

Понимание next() и итерационного протокола — это ключ к написанию эффективного и "питоничного" кода, поскольку итерирование — одна из самых частых операций в Python.