Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансияв ленте Talanto
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью
Разместить вакансию

Популярные направления

Все подборки
  • Backend вакансии
  • Python
  • DevOps вакансии
  • Бизнес-аналитик
  • QA вакансии
  • Продакт-менеджер

Разработка

  • Frontend вакансии
  • Fullstack вакансии
  • Mobile вакансии
  • iOS
  • Android
  • AI вакансии

По стеку

  • Java
  • Go
  • Node.js
  • Kotlin
  • Rust
  • .NET
  • C#
  • C++
  • PHP

DevOps и инфраструктура

  • CI/CD
  • Облачные технологии
  • Terraform / IaC
  • Linux-инфраструктура
  • Kubernetes
  • Мониторинг и Observability
  • Кибербезопасность
  • SRE

Аналитика и данные

  • Аналитик данных
  • Системный аналитик
  • Инженер данных
  • Data Scientist

Другие направления

  • Ручное тестирование
  • Проджект-менеджер
  • UI/UX дизайн

По регионам

  • Вакансии в Европе
  • Вакансии в США
  • Вакансии в Канаде
  • Работа в России

По формату

  • Удалённые вакансии
  • Релокация в США
  • Гибридная работа
  • Офисная работа

По уровню

  • Junior вакансии
  • Middle вакансии
  • Senior вакансии
КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме PythonВсе вопросы
PythonJuniorLive-кодинг

Что такое __iter__ и __next__?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

__iter__(self) возвращает iterator (часто self, если объект — сам iterator). __next__(self) возвращает следующий элемент или поднимает StopIteration. Это iterator protocol, на котором работают for, list(), sum(), zip, enumerate.

Контракт iterator protocol

class MyIterator:
    def __iter__(self):
        return self                  # iterator возвращает себя

    def __next__(self):
        if no_more_items:
            raise StopIteration       # сигнал конца — обязателен
        return next_item

Два главных потребителя — встроенные функции iter(obj) и next(it[, default]). for внутри использует именно их.

Минимальный пример

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

print(list(CountDown(3)))    # [3, 2, 1]

# Можно использовать и через next() с дефолтом
it = CountDown(2)
print(next(it))              # 2
print(next(it))              # 1
print(next(it, None))        # None — нет StopIteration наружу

Раздельный iterable и iterator

Если хочется многократного прохода, отделите коллекцию от итератора:

class Range:
    def __init__(self, n):
        self.n = n

    def __iter__(self):
        return RangeIterator(self.n)

class RangeIterator:
    def __init__(self, n):
        self.i = 0
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        if self.i >= self.n:
            raise StopIteration
        v = self.i
        self.i += 1
        return v

r = Range(3)
print(list(r), list(r))      # [0, 1, 2] [0, 1, 2]

Sentinel-форма iter()

Малоизвестная фишка: iter(callable, sentinel) вызывает callable до тех пор, пока не вернётся sentinel.

import sys
# Читаем stdin по строке до пустой
for line in iter(sys.stdin.readline, ""):
    print(line, end="")

__iter__ только с __getitem__

Старый sequence-protocol: если у класса есть __getitem__(0), __getitem__(1), ... до IndexError, объект всё равно итерируется. __iter__ в этом случае необязателен, но рекомендован.

Подводные камни

  • Забыли raise StopIteration — for зациклится.
  • __next__ вернул None вместо StopIteration — конец потока не распознан, for выдаст None и продолжит.
  • __iter__ возвращает не итератор, а сам объект, у которого нет __next__ — TypeError: iter() returned non-iterator.
  • Iterator с __iter__, возвращающим новый iterator каждый раз, теряет состояние.
  • В Python 3.7+ исключение StopIteration, поднятое внутри generator function, превращается в RuntimeError (PEP 479).
  • Стандарт: __next__ в Python 3 (раньше был next() в Python 2 без подчёркиваний).

Частые вопросы на собеседовании

  • Что такое truthy и falsy значения в Python?
  • Когда использовать threading?
  • Что такое type hints и зачем они нужны?
  • Как работает yield?

Типичные ошибки

  • Не знать, кто вызывает next.
  • Забывать raise StopIteration.
  • Возвращать новый iterator из next.

Что проверяет интервьюер

  • Может реализовать простой iterator.
  • Объясняет StopIteration.
  • Понимает отличие коллекции от состояния прохода.

Как вы знаете этот вопрос?

Проверить себя по теме Python →

Источники

  • https://docs.python.org/3/reference/datamodel.html
  • https://docs.python.org/3/library/stdtypes.html
←Предыдущий вопросЧто такое *args и **kwargs? Как работает распаковка аргументов при вызове функции?Следующий вопрос→Что такое ASGI?

Связанные темы

PythonIterationProtocols