В этой статье будет объяснено использование функции «enumerate», доступной в стандартной библиотеке модулей Python. Функция Enumerate позволяет вам присваивать «index» или «count» элементам в любом итерируемом объекте. Затем вы можете реализовать для них дополнительную логику, поскольку у вас будет доступ как к значениям, так и к сопоставленному с ними счетчику.
Синтаксис и базовый пример
Если вы использовали цикл «for» в других языках программирования, особенно в языке «C» и других языках, имеющих синтаксис стиля «C», вы могли указать начальный индекс в цикле. Для справки, вот как выглядит цикл for в «C» и других языках с аналогичным синтаксисом:
for (int i = 0; i < 10; i++)
{
printf(“%d\n”, i);
}
Оператор цикла инициализирует переменную, имеющую нулевое значение, проверяет, что оно меньше порогового значения, и увеличивает его на один счет после оценки логики внутри блока цикла (если выполняется условие остановки). Таким образом, вы можете использовать индекс и назначать его любым объектам, указанным в вашем блоке цикла. Для сравнения, вот как выглядит цикл for с таким же результатом в Python:
for i in range(0, 10): print (i)
Функция «range» в Python позволяет вам указать последовательность диапазонов номеров, которая имеет шаг по умолчанию 1. Вы можете изменить значение шага, указав третий аргумент. Второй аргумент в функции «range» используется для установки порога для условия остановки. Оба образца кода дают следующий результат:
0 1 2 3 4 5 6 7 8 9
Эти циклы работают нормально, если вы просто хотите сгенерировать некоторую числовую последовательность и связать их с некоторой логикой внутри оператора цикла. Однако вам, возможно, придется использовать другой вложенный цикл или функцию yield для любого итеративного типа, чтобы присвоить им какое-то отслеживаемое количество. Метод «enumerate» позволяет легко назначать индексы для итераций в одном операторе, тем самым устраняя необходимость в выполнении нескольких вложенных циклов. Взгляните на этот пример кода:
numbers = ["zero", "one", "two", "three", "four", "five"] enumerated_numbers = enumerate(numbers) for index, item in enumerated_numbers: print (index, item)
Первый оператор определяет новую переменную с именем «numbers» и назначает ей итерацию (тип списка). Второй оператор показывает использование функции «enumerate», в которой вы предоставляете ей итерацию в качестве обязательного аргумента. Третий оператор преобразует переменную enumerated_numbers в объект типа списка. По умолчанию функция enumerate генерирует объект типа enumerate, а не итеративный тип, поэтому вам необходимо преобразовать его. После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:
[(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five')]
Функция enumerate присваивает счет каждому элементу итеративного типа и создает кортежи, имеющие парные значения. По умолчанию счет начинается с нуля.
Теперь, когда вы присвоили номер каждому элементу итеративного типа, вы можете легко перебрать его без написания вложенных операторов:
numbers = ["zero", "one", "two", "three", "four", "five"] enumerated_numbers = enumerate(numbers) for index, item in enumerated_numbers: print (index, item)
Указанный выше пример кода даст следующий результат:
0 zero 1 one 2 two 3 three 4 four 5 five
Вы можете сделать код короче, используя встроенную функцию «enumerate», как показано в примере ниже:
numbers = ["zero", "one", "two", "three", "four", "five"] for index, item in enumerate(numbers): print (index, item)
Использование Enumerate с другим начальным индексом
Функция enumerate принимает необязательный аргумент, в котором вы можете указать начальный индекс. По умолчанию он равен нулю, но вы можете изменить его, используя аргумент «start»:
numbers = ["one", "two", "three", "four", "five"] for index, item in enumerate(numbers, start=1): print (index, item)
Во втором утверждении аргумент «start = 1» используется для изменения начальной точки. После выполнения указанного выше примера кода вы должны получить следующий результат:
1 one 2 two 3 three 4 four 5 five
Назначение индекса с шагами
В первом разделе этой статьи показан синтаксис цикла for на языке C, где вы можете определить шаги между каждым последующим счетчиком или индексом. Функция enumerate в Python не имеет такого аргумента, поэтому вы не можете указать шаг между счетчиками. Вы действительно можете написать свою собственную логику для реализации шагов внутри пронумерованного блока цикла «for». Однако есть способ реализовать пользовательские шаги, написав минимальный код. В следующем примере показана реализация шагов с использованием функций «zip» и «range»:
numbers = ["zero", "two", "four", "six"] for index, item in zip(range(0, 7, 2), numbers): print (index, item)
Функция «zip» позволяет создавать пары, выбирая элементы с одинаковым индексом из двух или более итераций. Таким образом, здесь функция «zip» выбирает элемент из итерации, возвращаемой функцией «range(0, 7, 2)», и другой элемент из списка «numbers», а затем объединяет их в кортеж. Конечным результатом является реализация, идентичная реализации функции «перечисление», но с пользовательскими шагами, указанными в качестве третьего аргумента в функции «range(0, 7, 2)» (в данном случае 2). После выполнения указанного выше примера кода вы должны получить следующий результат:
0 zero 2 two 4 four 6 six
Заключение
Функция «перечислить» в Python позволяет писать краткий код, присваивая числовую последовательность элементам в повторяемом объекте. Это действительно полезно, если вы хотите отслеживать индекс элементов внутри итеративного типа. Если вы хотите «перечислить» итерационные типы с помощью настраиваемых шагов, используйте функцию «zip», описанную в последнем примере.