Что такое enumerate в питоне

Функция Enumerate в Python

Что такое enumerate в питоне. Смотреть фото Что такое enumerate в питоне. Смотреть картинку Что такое enumerate в питоне. Картинка про Что такое enumerate в питоне. Фото Что такое enumerate в питоне

Функция Enumerate в Python

Функция enumerate() принимает следующий вид:

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

enumerate() возвращает объект перечисления, для которого вы можете вызвать метод __next__() (или next() в Python 2), чтобы получить кортеж, содержащий счетчик и текущее значение итерационного объекта.

Вот пример того, как создать список кортежей с помощью list() и как перебрать цикл:

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

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

Примеры кода с функцией enumerate()

Цикл for в Python полностью отличается от традиционного цикла for в стиле C, который доступен во многих языках программирования. Цикл for в Python эквивалентно другим языкам цикла foreach.

Обычная техника, используемая новыми разработчиками Python для получения соответствующего индекса при работе с итерациями, заключается в использовании либо шаблона range(len(…)), либо набора и приращения счетчика:

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

Все методы будут выдавать один и тот же результат:

Заключение

В этой статье мы показали вам, как использовать функцию enumerate() в Python.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

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

Что такое enumerate в питоне. Смотреть фото Что такое enumerate в питоне. Смотреть картинку Что такое enumerate в питоне. Картинка про Что такое enumerate в питоне. Фото Что такое 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()

Функция 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, примеры использования

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

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

Что такое enumerate в питоне. Смотреть фото Что такое enumerate в питоне. Смотреть картинку Что такое enumerate в питоне. Картинка про Что такое enumerate в питоне. Фото Что такое enumerate в питоне

В результате, 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 в питоне. Смотреть картинку Что такое enumerate в питоне. Картинка про Что такое enumerate в питоне. Фото Что такое enumerate в питоне

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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