Python функция enumerate()
Функция 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 и распаковки структуры данных из официальной документации.