logo
Ещё

Функция enumerate() в Python

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

Что делает enumerate()?

Enumerate() – это функция, которая берет любой итерируемый объект (списки, кортежи, словари и так далее), добавляет к каждому значению индекс и возвращает итератор – специальный объект, который по запросу выдает свое содержимое, по одной записи за раз. Каждое значение итерируемого объекта и его индекс объединяются в кортеж – например, список [‘a’, ‘b’, ‘c’] превращается в [(0, ‘a’), (1, ‘b’), (2, ‘c’)]. Как это выглядит на практике:


У работы с итераторами есть свои особенности – если вы, например, хотите вывести содержимое итератора через print(), то у вас не получится просто передать его в функцию:


За одно обращение итератор может выдать только одну «единицу информации», если хотите перебрать все – пользуйтесь циклом for как в примере выше. При этом вы можете самостоятельно запросить следующую «порцию» через встроенную функцию next():


Последний важный момент – enumerate() в качестве второго необязательного аргумента принимает начальный индекс (start), то есть индекс, с которого начнется отсчет в итераторе:


Где его можно использовать?

Enumerate() полезен тогда, когда нам нужны индексы значений. Да, их можно достать из списка или кортежа самостоятельно, но придется писать плохочитаемые условия – вроде перебора по range(len(iterable)). Наиболее же полезен enumerate() тогда, когда нам нужно изменить точку отсчета – значение в списке, стоящее на нулевом индексе, должно иметь какой-то другой порядковый номер. Опять же – это можно реализовать и без enumerate(), но тогда в коде появятся «магические числа», то есть конкретные числа, которые взяты из контекста, известного только разработчику в момент разработки – плохая практика, которую нужно избегать.

Особенно часто enumerate() используется вместе со «start=1» – если мы куда-то экспортируем данные и хотим, чтобы они выглядели более «человечно», стоит поменять старт индексации с 0 на 1:

items = ["яблоко", "банан", "апельсин"]

for index, value in enumerate(items, start=1):

print(f"Индекс {index}: {value}")

Опять же, это можно сделать и без enumerate(), но код будет хуже читаться – не заметить «-1» при расчете индекса очень просто.