Python функция enumerate()
Функция enumerate Python очень полезна и трудно описать в одном предложении её нужность и востребованность.
И все же, это супер полезная функция, которую многие новички и даже опытные питонщики не знают. Если сказать кратко, 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')]
Для каждого элемента во входном list (names) итератор, возвращаемый enumerate(), создает кортеж формы (индекс, элемент).
Выводы
- enumerate - это встроенная функция Python, используемая для циклического перебора с автоматической индексацией, сгенерированной переменной счётчиком.
- По умолчанию счётчик начинается с 0, но можно установить его в любое целое число.
- enumerate была добавлена в Python начиная с версии 2.3 (PEP 279).
- Функция enumerate на языке Python помогает вам писать больше питоновских и идиоматических циклов, которые избегают использования неумелого и подверженного ошибкам ручного индексирования.
- Чтобы использовать enumerate в полном объеме, обязательно изучите возможности итераторов Python и распаковки структуры данных из официальной документации.