Enumerate в питоне что это
Перейти к содержимому

Enumerate в питоне что это

Python функция enumerate()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция enumerate

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

Функция enumerate() применяется для так называемых итерируемых объектов (список относится к таковым) и создает объект-генератор, который генерирует кортежи, состоящие из двух элементов – индекса элемента и самого элемента.

Эти кортежи можно распаковывать, то есть извлекать индекс и значение, в теле цикла:

Однако чаще это делают еще в заголовке for , используя две переменные перед in :

Функция enumerate() используется для упрощения прохода по коллекциям в цикле, когда кроме самих элементов требуется их индекс:

В данном случае на каждой итерации цикла из объекта, полученного от вызова функции enumerate , извлекается очередной кортеж. Этот кортеж состоит из индекса очередного элемента списка и значения этого элемента. Элементы кортежа связываются с идентификаторами id и item .

Без использования enumerate в цикл пришлось бы вводить переменную-счетчик:

Или извлекать элементы по индексу:

Другими словами, без функции enumerate можно обойтись. Однако в ряде случаев она может быть удобней.

Если enumerate() так хороша, зачем использовать range() в заголовке for ? На самом деле незачем, если только вам так не проще. Кроме того, бывают ситуации, когда значения не нужны, нужны только индексы. Однако следует учитывать один нюанс. Функция enumerate() возвращает так называемый объект-итератор. Когда такие объекты сгенерировали значения, то становятся «пустыми». Второй раз по ним пройтись нельзя.

Функция range() возвращает итерируемый объект. Хотя такой объект может быть превращен в объект-итератор, сам по себе таковым не является.

Когда range() и enumerate() используются в заголовке for , то разницы нет, так как range- и enumerate-объекты не присваиваются переменным и после завершения работы цикла теряются. Но если мы присваиваем эти объекты переменным, их отличия могут сказаться на выполнении программы:

Сначала мы прерываем извлечение элементов из объектов на элементе с индексом 1. Когда снова прогоняем объекты через цикл for , то в случае r_obj обход начинается сначала, а в случае e_obj продолжается после места останова. Объект e_obj уже не содержит извлеченных ранее элементов.

Практическая работа

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

Примеры решения и дополнительные уроки в android-приложении и pdf-версии курса

Функция enumerate

В языке программирования Python 3 есть встроенная функция enumerate. Периодически требуется пройти по элементам списка и при этом обрабатывать не только значение элемента, но так же и его порядковый номер в списке. Вот в этом случае она и понадобится.

Аргументы

Аргументов у функции enumerate два:

  • Объект, элементы которого будем перебирать. Необязательно это должен быть список, это может быть, например, множество или словарь.
  • Начальное значение индекса (start). По умолчанию начальное значение равно 0.

Возвращает итератор на кортеж из двух элементов: индекс и элемент объекта.

Пример использования

Вот пример использования. С помощью enumerate мы перебираем весь список data . При переборе мы получали кортеж, состоящий из двух элементов. В переменной num будет порядковый номер элемента в списке. В переменной val – значение элемента. В качестве второго аргумента в функции enumerate мы использовали цифру 1, чтобы индексы начинались с единицы, а не с нуля.

Без использования enumerate

Если не использовать enumerate в Python 3, то можно сделать свой счетчик. Задать ему начальное значение и при каждом проходе цикла его увеличивать. Например, следующим образом.

Использование next

Функция enumerate возвращает итератор. Используя функцию next можно получить кортежи.

Если при очередном вызове next, следующий элемент будет отсутствовать, возникает исключение StopIteration. Подробнее про типы исключений и как их обрабатывать есть отдельная статья на сайте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *