Python функция enumerate()

| Python

Функция enumerate Python очень полезна и трудно описать в одном предложении её нужность и востребованность.

Это супер полезная функция, которую многие новички и даже опытные питонщики не знают. Если сказать кратко, enumerate() позволяет перебирать коллекцию элементов, отслеживая индекс текущего элемента.

Документация по встроенной функции enumerate.

Рассмотрим пример:

names = ['Bob', 'Alice', 'Guido']
for index, value in enumerate(names):
    print(f'{index}: {value}')

Этот код вернёт результат:

0: Bob
1: Alice
2: Guido

Производится итерация по списку names и генерация индекса для каждого элемента, увеличивая переменную счётчика, начиная с нуля.

Сделайте свои циклы более питоническими с enumerate()

Некоторые начинающие Python разработчики, пришедшие из C или Java, иногда используют range(len (...)) антипаттерн, чтобы поддерживать индекс во время итерации по списку с помощью цикла for:

# Антипаттерн! Не делайте так.
for i in range(len(my_items)):
    print(i, my_items[i])

С помощью функции enumerate() можно сделать эту циклическую конструкцию гораздо более «питонической» и идиоматической.

Обычно нет необходимости создавать индексы элементов вручную в Python – достаточно просто поручить эту работу функции enumerate(). И в результате код будет легче читаем и менее уязвим для опечаток.

Изменение стартового индекса

Ещё одна полезная функция – возможность выбора начального индекса для перечисления. Функция enumerate() принимает необязательный аргумент, который позволяет установить начальное значение для внутренней переменной счетчика:

names = ['Bob', 'Alice', 'Guido']
for index, value in enumerate(names, 1):
    print(f'{index}: {value}')

В приведенном выше примере вызов функции заменён на enumerate(names, 1), а дополнительный аргумент теперь начинает индексирование с единицы вместо нуля:

1: Bob
2: Alice
3: Guido

Как enumerate() работает за кулисами

Рассмотрим более подробно, как функция enumerate() работает за кулисами. Часть её магии заключается в том, что enumerate() реализована как итератор Python. Это означает, что индексы элементов генерируются лениво, сохраняя низкое потребление памяти и ускоряя выполнение программы.

Рассмотрим код:

>>> names = ['Bob', 'Alice', 'Guido']
>>> enumerate(names)
<enumerate object at 0x8757f5678>

В приведенном выше фрагменте кода выполняется то же перечисление, которое было приведёно в предыдущих примерах. Но вместо того, чтобы сразу перебирать результат вызова enumerate(), просто распечатывается возвращаемый объект в консоль Python.

Как вы можете видеть – это «enumerate object». Фактическии – это итератор. И, как уже было сказано, он генерирует свои выходные элементы лениво и один за другим, только когда их запрашивают.

Чтобы получить элементы «по требованию» достаточно вызвать встроенную функцию list() на итераторе:

>>> list(enumerate(names))
[(0, 'Bob'), (1, 'Alice'), (2, 'Guido')]

Для каждого элемента во входном списке names итератор, возвращаемый enumerate(), создаёт кортеж формы (индекс, элемент).

Выводы

  • enumerate - это встроенная функция Python, используемая для циклического перебора с автоматической индексацией, сгенерированной переменной счётчиком.
  • По умолчанию счётчик начинается с 0, но можно установить его в любое целое число.
  • enumerate была добавлена в Python начиная с версии 2.3 (PEP 279).
  • Функция enumerate на языке Python помогает вам писать больше питоновских и идиоматических циклов, которые избегают использования неумелого и подверженного ошибкам ручного индексирования.
  • Чтобы использовать enumerate в полном объеме, обязательно изучите возможности итераторов Python и распаковки структуры данных из официальной документации.