что такое enumerate в python

Функция enumerate, примеры использования

На этом дополнительном занятии я расскажу о функции enumerate. Прежде чем мы углубимся в эту тему, напомню, что в Python для последовательного перебора элементов любого итерируемого объекта используется оператор цикла for. Например:

В момент работы этого цикла переход к следующему элементу осуществляется через объект-итератор. Оператор for автоматически вызывает функцию next() этого итератора и получает текущее значение элемента. И так, пока не дойдет до конца коллекции:

В результате, x – это лишь ссылка на текущий элемент списка и, как мы уже говорили, если попытаться изменить значение коллекции через x, то ничего не произойдет, т.к. мы лишь изменим саму ссылку x.

Если же внутри цикла требуется не только перебирать элементы, но и менять их, то необходимо обращаться к текущему элементу по его индексу, например, так:

Результатом будет измененная коллекция:

Однако, если вместо a[i] использовать x, то упорядоченный список останется без изменений. Этот простой пример наглядно показывает необходимость использования индексов, если нам нужно менять значения элементов. Так вот, чтобы непосредственно в цикле for не только получать ссылку на текущий элемент, но и знать его порядковый индекс, как раз и используется функция enumerate.

Перепишем наш пример с использованием этой функции:

Смотрите, у функции enumerate первым параметром указывается перебираемая коллекция (любой итерируемый объект), а при переборе элементов она выдает кортеж из двух значений:

(индекс, значение элемента)

И программа значительно упрощается и приятнее читается. Давайте еще проще запишем этот цикл, пусть он просто выводит в консоль то, что возвратит нам эта функция:

Как видите, именно кортеж и получаем на каждой итерации работы цикла. То есть, эта функция используется исключительно для удобства, когда нам нужно не только иметь ссылку на текущий элемент, но и знать его порядковый индекс.

Вообще функция enumerate имеет следующий синтаксис:

Здесь sequence – это любой итерируемый объект; start – начальное значение индекса. Например, если вторым параметром указать 1, то индекс будет отсчитываться уже от 1:

И так далее. Давайте теперь разберемся, что возвращает функция enumerate? Возможно, вас сейчас удивила эта фраза: я же только что говорил, что на каждой итерации мы получаем кортеж из двух значений – индекса и самого элемента? Все так, но ключевым здесь является фраза «на каждой итерации». Сейчас я поясню, что имею в виду. Смотрите, если просто взять и вызвать эту функцию, а затем, результат вывести в консоль:

то увидим сообщение:

Никакого кортежа здесь нет, g – это итерируемый объект, то есть, объект-итератор, который можно перебирать с помощью функции next:

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

То есть, это просто дополнительная обертка над итерируемым объектом sequence. Вот что из себя представляет функция enumerate.

В заключении отмечу, как эта функция применяется к разным типам объектов:

Источник

Понимание метода enumerate() в Python

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

Использование метода enumerate()

Метод enumerate() Python может преобразовать любую итеративную последовательность в объект перечисления с добавленными индексами. Эта последовательность может быть списком, строкой или кортежем. Но это не может быть словарь или набор, поскольку они не являются последовательностями.

Перечисление

Чтобы распечатать этот объект перечисления, мы можем использовать простой цикл for обхода его.

Обратите внимание, на этот раз мы можем получить доступ как к индексу элемента, так и к значению элемента одновременно.

Значит, вывод оправдан.

enumerate() работает таким же образом и с кортежами.

Перечислить строку

Точно так же мы также можем использовать этот метод для преобразования строки в объект перечисления с добавленными индексами.

Посмотрим, как это сделать.

С параметром Start

Давайте посмотрим на пример, в котором мы пытаемся изменить индексирование списка с начальным индексом 0 на список с начальным индексом 20.

Здесь из выходных данных видно, что при start=20 начальный индекс объекта enumerate, возвращаемого методом, равен 20. В то время как без start (значение по умолчанию 0) индексация начинается с 0.

Обратите внимание, что метод enumerate() работает только для последовательностей. Следовательно, словари или наборы не могут быть преобразованы в объекты enumerate().

Источник

Читайте также:  что такое активное и пассивное воображение

Встроенные функции для перебора последовательностей в Python

Необходимость перебрать последовательность — список, кортеж, строку или словарь — возникает довольно часто. Когда вы перебираете их в циклах, не возникает ли у вас впечатление, будто ваш код беспорядочен? Не хочется ли вам удалить из него некоторые переменные? К счастью, в Python есть несколько полезных встроенных функций, с помощью которых можно сделать свой код более лаконичным и читаемым.

В этом руководстве мы расскажем, какие встроенные функции для работы с последовательностями есть в Python. И, разумеется, разберем на простых примерах, как эти функции работают.

Как перебрать последовательность с помощью функции enumerate() в Python

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

Давайте посмотрим на синтаксис:

Функция принимает два аргумента:

Результат работы такой функции будет следующим:

Мы получили элементы итерируемого объекта вместе с их индексами.

Возьмем пример без указания значения start :

Как видите, индексирование начинается с 0, хотя мы не указывали второй аргумент при вызове функции. Всё потому, что по умолчанию значение аргумента start равно 0.

Возьмем еще один пример с указанием индекса:

Итак, здесь наш индекс начинается с 10, поскольку мы устанавливаем аргумент start равным 10. В результате функция начинает отсчет индексов с 10.

Возьмем пример со словарем:

Перебирая словарь, мы получаем только ключи, а не значения словаря.

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

Функции для перебора элементов словаря в Python

Для перебора словаря и получения значений в Python есть две встроенные функции:

Давайте рассмотрим примеры работы функции items() :

items() также можно использовать с циклом for :

В этом примере мы получаем пары ключ-значение.

Теперь давайте воспользуемся функцией values() :

С циклом for наш код будет выглядеть так:

Здесь при итерации мы получаем только значения словаря, без ключей.

Как перебрать последовательность с помощью функции zip() в Python

Функция zip() принимает несколько итерируемых объектов с одинаковыми значениями индексов, объединяет их и возвращает итератор. Итератором может быть кортеж, список или словарь.

Посмотрим на синтаксис:

К примеру, функцию zip() можно использовать так:

Здесь два списка объединяются, и в результате мы получаем итератор.

Если длины исходных итерируемых объектов различны, итератор перестает производить вывод, когда заканчивается самый короткий из объектов.

Итерируемых объектов может быть не два, а больше. Разберем пример с тремя:

Как перебрать последовательность с помощью функции sorted() в Python

Функция sorted() возвращает элементы итерируемого объекта в отсортированном порядке.

Синтаксис данной функции выглядит следующим образом:

sorted(iterable, key=key, reverse=reverse)

Функция принимает три аргумента:

По умолчанию наш вывод будет списком элементов в возрастающем порядке. Строки сортируются в алфавитном порядке, числа — по возрастанию.

Исходный объект остается неизменным, поскольку функция sorted() не изменяет исходные значения. Она ​​только выводит результат сортировки на экран. Результатом будет упорядоченный список.

Давайте рассмотрим случай со встроенной функцией.

По умолчанию вывод будет в возрастающем порядке. Для изменения порядка следует добавить reverse=True :

В качестве параметра key можно использовать не только встроенные функции. Давайте рассмотрим случай с пользовательской:

Мы использовали лямбда-функцию для простоты, но вы можете использовать и традиционный метод определения функции.

Как перебрать последовательность с помощью функции reversed() в Python

Функция reversed() возвращает элементы итерируемого объекта в обратном порядке.

Синтаксис этой функции следующий:

Аргумент iterable – это итерируемый объект (список, кортеж, множество и т.д.).

Заключение

Мы рассмотрели встроенные функции Python, позволяющие перебрать последовательность. С ними вы сможете писать более чистый и упорядоченный код.

Источник

🐍 Python enumerate: упрощаем циклы с помощью счетчиков

Итерация с помощью циклов for

Цикл for в Python использует итерацию на основе коллекции. Это означает, что Python на каждой итерации назначает следующий элемент из iterable переменной цикла, как в этом примере:

Здесь значения состоят из трех строк: a, b и c. В Python списки – один из типов итерационных объектов iterable. В цикле for переменная имеет значение value. На каждой итерации ее значение устанавливается равным следующему элементу из values.

Теперь представим, что нам необходимо вывести в списке индекс элемента на каждой итерации. Один из способов решения – создать переменную для хранения индекса и обновлять ее на каждой итерации:

В этом примере index – целое число, отслеживающее, как глубоко вы находитесь в списке. На каждой итерации на экран выводится index и value. Последним шагом в цикле является обновление числа, хранящегося в index. Здесь может всплыть ошибка, если забыть обновить index:

Читайте также:  что делать сильно болит живот как при месячных

В примере на каждой итерации index остается равным 0, т. к. нет кода для его обновления. Этот вид ошибки трудно отследить, особенно в длинных и сложных циклах.

Другой распространенный способ решения этой проблемы – использовать range() в сочетании с len() для автоматического создания index, и вам не придется помнить о его обновлении:

Одной из ошибок может быть отсутствие обновления value в начале каждой итерации.

Пример несколько ограничен, поскольку values должны разрешать доступ к своим элементам с помощью целочисленных индексов. Итерируемые объекты, разрешающие этот вид доступа, называют последовательностями.

В цикле for можно использовать любую итерацию, но только последовательности доступны по целочисленным индексам. Попытка получить доступ к элементам по индексу из генератора или итератора вызовет ошибку TypeError:

К счастью, функция enumerate() позволяет избежать все эти проблемы. Она доступна в Python с версии 2.3.

Использование enumerate()

Вы можете использовать enumerate() в цикле почти так же, как объект iterable. Вместо того чтобы помещать итерацию непосредственно после in в цикл for, вы помещаете ее в круглые скобки enumerate(). Придется немного изменить переменную цикла, как показано в примере:

Когда вы используете enumerate(), функция возвращает две переменные цикла: количество текущих итераций и значение элемента на текущей итерации.

Как и в обычном цикле for, переменные цикла могут быть названы как угодно (например, как count и value в примере выше). Вам не нужно помнить, что следует из итератора получить доступ к элементу и подвинуть индекс в конец цикла – все делается автоматически.

Функция enumerate() имеет дополнительный аргумент, который можно использовать для управления начальным значением счетчика. По умолчанию оно равно 0, и если вы хотите получить первый элемент списка, используйте индекс 0:

Здесь можно увидеть, что доступ к значениям с индексом 0 дает первый элемент a. Бывает так, что необходимо запустить счетчик не с 0. В этом случае используйте аргумент start для enumerate(), чтобы изменить начальный счетчик:

Практика с enumerate()

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

Количество итеративных элементов

В предыдущем разделе вы видели, как использовать enumerate() для печати. Разберем скрипт, читающий файлы reST и сообщающий пользователю о проблемах с форматированием.

Не беспокойтесь, если что-то не понятно, т. к. цель – показать реальное использование enumerate():

check_whitespace() принимает один аргумент, lines, который является строками обрабатываемого файла. Сценарий возвращает номер строки, сокращенный как lno и line, а далее идет проверка на нежелательные символы: \r, \t, табуляции и пробелы.

Когда встречается один из этих элементов, функция выдает текущий номер строки и сообщение для юзера. Переменная count lno хранит в себе номер строки, а не индекс, что позволит пользователю узнать местонахождение проблемы.

Условные операторы для пропуска элементов

Иногда есть необходимость выполнить действие на первой итерации цикла:

Мы хотим вывести дополнительную информацию о тестовом пользователе. Поскольку этот юзер первый, можно взять первое значение индекса цикла для выходных данных.

Можно комбинировать математические операции с условиями. Например, если вам понадобится возвращать элементы из итерационной модели, имеющие четный индекс. Это делается следующим образом:

В цикле for проверяется, равен ли остаток от деления index на 2 нулю и если так, то элемент добавляется к значениям.

Вы можете сделать код более понятным, используя list comprehension без инициализации пустого списка:

В этом примере even_items() использует list comprehension, а не цикл for для извлечения каждого элемента из списка, индекс которого является четным числом.

Вы можете проверить, что even_items() работает как ожидалось, получив четные элементы из диапазона целых чисел от 1 до 10. Результатом будет [2, 4, 6, 8, 10]:

even_items() возвращает четные элементы из seq. Теперь можно проверить, как эта штука будет работать с буквами алфавита ASCII:

Строка alphabet содержит двадцать шесть строчных букв ASCII-алфавита. Вызов even_items() и передача alphabet возвращает список чередующихся букв.

Строки в Python – это последовательности, которые можно использовать как в циклах, так и в целочисленном индексировании. В случае со строками нужны квадратные скобки для реализации той же функциональности, что и в even_items():

Читайте также:  что значит генеральный подрядчик

Понимание enumerate()

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

Чтобы лучше понять, как работает enumerate(), реализуйте собственную версию с помощью Python. Она должна следовать двум требованиям:

Один из способов написания функции по данным спецификациям приведен в документации Python:

Вы создаете список четырех сезонов для работы. Далее показываете, что вызов my_enumerate() с ними в качестве последовательности создаст объект генератора. Это происходит, поскольку ключевое слово yield отправляет значения обратно вызывающему объекту.

Наконец создается два списка из my_enumerate(): в одном начальное значение остается по умолчанию 0, а в другом start изменяется на 1. В обоих случаях вы получаете список кортежей, в которых первым элементом является счетчик, а вторым – значение из seasons.

Мы реализовали эквивалент enumerate() всего из нескольких строк кода, хотя оригинальный код на C для enumerate() несколько больше. Это означает, что Python очень быстрый и эффективный.

Распаковка аргументов с помощью enumerate()

Когда вы используете enumerate() в цикле for, вы говорите Python работать с двумя переменными: одной для подсчета и одной для значения. Все это можно сделать, используя распаковку аргументов.

Идея в том, что кортеж может быть разбит на несколько переменных в зависимости от длины последовательности. Например, если распаковать кортеж из двух элементов в две переменные:

Сначала создается кортеж с элементами 10 и «а». Затем вы распаковываете его в first_elem и second_elem, присваивая по одному из значений кортежа.

Когда вызывается enumerate() и передается последовательность значений, Python возвращает итератор, а когда вы запрашиваете у итератора следующее значение, он отдает кортеж с двумя элементами: элемент кортежа (счетчик) и значение из переданной последовательности.

В этом примере создается список значений с двумя элементами «a» и «b». Затем значения передаются в enumerate() и присваивается возвращаемое значение enum_instance. Когда выводится enum_instance, можно видеть, что это экземпляр enumerate() с определенным адресом памяти.

Повторный вызов next() дает еще один кортеж, на этот раз с числом 1 и вторым элементом из значений «b». Наконец, вызов next() еще раз вызывает StopIteration, так как больше нет возвращаемых значений. Когда метод используется в цикле for, Python автоматически вызывает next() перед началом каждой итерации, пока StopIteration растет.

Если функция возвращает кортеж, можно использовать распаковку аргументов для назначения элементов кортежа нескольким переменным. Это мы делали выше, используя две переменные цикла.

Еще один способ увидеть распаковку аргументов – использовать цикл for со встроенным zip(), позволяющим перебирать две или более последовательности одновременно. На каждой итерации zip() возвращает кортеж, который собирает элементы из всех переданных последовательностей:

В цикле элементы сопоставляются, а затем выводятся. Вы можете объединить zip() и enumerate(), используя вложенную распаковку аргументов:

В цикле for используется вложенный zip() в enumerate(), т. е. каждый раз, когда цикл повторяется, enumerate() выдает кортеж с первым значением в качестве count и вторым в качестве другого кортежа с элементами из аргументов zip().

Заключение

В этой статье мы изучили:

Вы узнали много нового и теперь способны упростить ваши циклы, чтобы сделать код на Python более профессиональным.

Источник

Когда вы кодируете на Python, вы можете использовать функцию enumerate() и for loop чтобы распечатать каждое значение итерации со счетчиком.

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

Как использовать for loop без функции enumerate() в Python

Мы можем использовать for loop чтобы просмотреть список и распечатать каждое имя. Мы также собираемся увеличивать переменную count на 1 каждый раз, чтобы отслеживать, сколько раз мы перебирали список.

Вот как будет выглядеть результат на экране:

Хотя этот подход действительно работает, он представляет собой возможную ошибку.

Если бы я изменил код, в консоли был бы напечатан новый результат:

Теперь переменная count больше не отслеживает точно, сколько раз мы просматривали список в цикле.

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

Встроенная функция enumerate() принимает итерируемый объект и необязательный начальный аргумент.

Мы можем использовать функцию enumerate() с for loop чтобы распечатать значения итерации со счетчиком.

Как использовать for loop и функцию enumerate() в Python

В этом примере мы хотим распечатать список направлений, ведущих от Таймс-сквер до Джульярдской музыкальной школы в Нью-Йорке, штат Нью-Йорк.

Сначала нам нужно создать список directions :

Вот как выглядит все вместе:

Вот как выглядят результаты в консоли:

Источник

Строительный портал