Для чего в python используется встроенная функция 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, позволяющие перебрать последовательность. С ними вы сможете писать более чистый и упорядоченный код.
Функция 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.
В заключении отмечу, как эта функция применяется к разным типам объектов:
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
Встроенный в Python метод enumerate() преобразует переданную последовательность в объект enumerate, имеющий те же элементы в форме кортежа. Далее функция добавляет индекс к соответствующим элементам кортежа.
Использование метода enumerate()
Метод enumerate() Python может преобразовать любую итеративную последовательность в объект перечисления с добавленными индексами. Эта последовательность может быть списком, строкой или кортежем. Но это не может быть словарь или набор, поскольку они не являются последовательностями.
Перечисление
Чтобы распечатать этот объект перечисления, мы можем использовать простой цикл for обхода его.
Обратите внимание, на этот раз мы можем получить доступ как к индексу элемента, так и к значению элемента одновременно.
Значит, вывод оправдан.
enumerate() работает таким же образом и с кортежами.
Перечислить строку
Точно так же мы также можем использовать этот метод для преобразования строки в объект перечисления с добавленными индексами.
Посмотрим, как это сделать.
С параметром Start
Давайте посмотрим на пример, в котором мы пытаемся изменить индексирование списка с начальным индексом 0 на список с начальным индексом 20.
Здесь из выходных данных видно, что при start=20 начальный индекс объекта enumerate, возвращаемого методом, равен 20. В то время как без start (значение по умолчанию 0) индексация начинается с 0.
Обратите внимание, что метод enumerate() работает только для последовательностей. Следовательно, словари или наборы не могут быть преобразованы в объекты enumerate().
Питонистический подход к циклам for: range() и enumerate()
Автор заметки, перевод которой мы сегодня публикуем, хочет рассказать о некоторых особенностях использования циклов for в Python.
Цикл for — это один из краеугольных камней программирования. С этими циклами будущие программисты знакомятся в самом начале учёбы и, после первого знакомства, пользуются ими постоянно.
Если вы занялись разработкой на Python, имея опыт работы с другим популярным языком программирования, вроде PHP или JavaScript, то вам знакома методика применения переменной-счётчика, хранящей, например, индекс текущего элемента массива, обрабатываемого в цикле. Вот пример работы с циклом, написанный на JavaScript:
Работая с циклами for очень важно понимать то, что эти циклы не перебирают массивы. Они лишь дают программисту механизм для работы с переменной-счётчиком, которая используется для обращения к элементам обрабатываемых массивов.
Старый (неудачный) способ работы с массивами
В результате вы можете обнаружить функцию range() и написать на Python нечто подобное следующему:
Проблема этого цикла заключается в том, что он не очень хорошо соответствует идеологии Python. В нём мы не перебираем список, а, вместо этого, используем вспомогательную переменную i для обращения к элементам списка.
Использование функции enumerate()
Эта функция принимает два аргумента: итерируемый объект и необязательное начальное значение счётчика.
Такой код получился гораздо чище кода из предыдущего примера. Мы ушли от работы со списком индексов, мы перебираем сами значения, получая к ним прямой доступ в цикле for, и видим значения, с которыми работаем, в объявлении цикла.
Итоги
Надеюсь, этот небольшой рассказ о циклах for в Python позволил вам узнать что-то новое об этом языке.