Функция enumerate
В Python есть еще одна встроенная функция, которая часто используется в заголовке for . Это функция enumerate() . Если range() позволяет получить только индексы элементов списка, то enumerate() – сразу индекс элемента и его значение.
Функция enumerate() применяется для так называемых итерируемых объектов (список относится к таковым) и создает объект-генератор, который генерирует кортежи, состоящие из двух элементов – индекса элемента и самого элемента.
>>> spisok = [16, 46, 26, 36] >>> for i in enumerate(spisok): . print(i) . (0, 16) (1, 46) (2, 26) (3, 36)
>>> b = "hello" >>> for i in enumerate(b): . print(i) . (0, 'h') (1, 'e') (2, 'l') (3, 'l') (4, 'o')
Эти кортежи можно распаковывать, то есть извлекать индекс и значение, в теле цикла:
>>> for item in enumerate(spisok): . print(item[0], item[1]) . 0 16 1 46 2 26 3 36
Однако чаще это делают еще в заголовке for , используя две переменные перед in :
>>> for id, val in enumerate(spisok): . print(id, val) . 0 16 1 46 2 26 3 36
Функция enumerate используется для упрощения прохода по коллекциям в цикле, когда кроме самих элементов требуется их индекс:
>>> a = [10, 20, 30, 40] >>> for id, item in enumerate(a): . a[id] = item + 5 . >>> a [15, 25, 35, 45]
В данном случае на каждой итерации цикла из объекта, полученного от вызова функции enumerate , извлекается очередной кортеж. Этот кортеж состоит из индекса очередного элемента списка и значения этого элемента. Элементы кортежа связываются с идентификаторами id и item .
Без использования enumerate в цикл пришлось бы вводить переменную-счетчик:
>>> a = [10, 20, 30, 40] >>> # используется счетчик >>> for num in a: . a[id] = num + 5 . id += 1 . >>> a [15, 25, 35, 45]
Или извлекать элементы по индексу:
>>> a = [10, 20, 30, 40] >>> for i in range(len(a)): # перебор по индексам . a[i] += 5 . >>> a [15, 25, 35, 45]
Другими словами, без функции enumerate можно обойтись. Однако в ряде случаев она может быть удобней.
Если enumerate() так хороша, зачем использовать range() в заголовке for ? На самом деле незачем, если только вам так не проще. Кроме того, бывают ситуации, когда значения не нужны, нужны только индексы. Однако следует учитывать один нюанс. Функция enumerate() возвращает так называемый объект-итератор. Когда такие объекты сгенерировали значения, то становятся «пустыми». Второй раз по ним пройтись нельзя.
Функция range() возвращает итерируемый объект. Хотя такой объект может быть превращен в объект-итератор, сам по себе таковым не является.
Когда range() и enumerate() используются в заголовке for , то разницы нет, так как range- и enumerate-объекты не присваиваются переменным и после завершения работы цикла теряются. Но если мы присваиваем эти объекты переменным, их отличия могут сказаться на выполнении программы:
>>> nums = [34, 15, 124, 800, 339] >>> >>> r_obj = range(len(nums)) >>> e_obj = enumerate(nums) >>> >>> for i in r_obj: . print(i) . if i == 1: . break . 0 1 >>> for i in r_obj: . print(nums[i]) . if i == 1: . break . 34 15 >>> for i, v in e_obj: . print(v) . if i == 1: . break . 34 15 >>> for i in r_obj: . print(nums[i]) . 34 15 124 800 339 >>> for i, v in e_obj: . print(v) . 124 800 339
Сначала мы прерываем извлечение элементов из объектов на элементе с индексом 1. Когда снова прогоняем объекты через цикл for , то в случае r_obj обход начинается сначала, а в случае e_obj продолжается после места останова. Объект e_obj уже не содержит извлеченных ранее элементов.
Практическая работа
Дан список чисел. Используя функцию enumerate() в заголовке цикла for , создайте второй список, в котором каждый элемент должен быть строкой, включающей через пробел индекс и значение соответствующего элемента первого списка.
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование
Счетчик элементов последовательности в циклах Python
Функция enumerate() вернет кортеж, содержащий отсчет от start и значение, полученное из итерации по объекту. Переданный в функцию объект должен быть последовательностью, итератором или другим объектом, который поддерживает метод итератора __next__() .
Функция enumerate() применяется в случаях, когда необходим счётчик количества элементов в последовательности. Позволяет избавиться от необходимости инициировать и обновлять отдельную переменную-счётчик.
Функцию enumerate() можно записать так:
def enumerate(sequence, start=0): n = start for elem in sequence: yield n, elem n += 1
Примеры использования функции enumerate() :
Наиболее часто функцию enumerate() используют в цикле for/in в качестве счетчика элементов последовательности:
>>> seq = list('абвгде') >>> seq # ['а', 'б', 'в', 'г', 'д', 'е'] >>> for i, val in enumerate(seq, start=1): . print(f'№ i> => val>') . # № 1 => а # № 2 => б # № 3 => в # № 4 => г # № 5 => д # № 6 => е
Получение списка парных кортежей (number, value) (порядковый номер в последовательности, значение последовательности).
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] >>> list(enumerate(seasons)) [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] # можно указать с какой цифры начинать считать >>> list(enumerate(seasons, start=1)) [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
Использование enumerate() для нахождения индексов минимального и максимального значений в числовой последовательности:
>>> lst = [5, 3, 1, 0, 9, 7] # пронумеруем список >>> lst_num = list(enumerate(lst, 0)) # получился список кортежей, в которых # первый элемент - это индекс значения списка, # а второй элемент - само значение списка >>> lst_num # [(0, 5), (1, 3), (2, 1), (3, 0), (4, 9), (5, 7)] # найдем максимум (из второго значения кортежей) >>> tup_max = max(lst_num, key=lambda i : i[1]) >>> tup_max # (4, 9) >>> f'Индекс максимума: tup_max[0]>, Max число tup_max[1]>' # 'Индекс максимума: 4, Max число 9' # найдем минимум (из второго значения кортежей) >>> tup_min = min(lst_num, key=lambda i : i[1]) >>> tup_min # (3, 0) >>> f'Индекс минимума: tup_min[0]>, Min число tup_min[1]>' # 'Индекс минимума: 3, Min число 0'
Использование функции enumerate() для того, что бы напечатать завершающий символ перевода строки.
import sys, time def teleprint(*args, delay=0.05, str_join=' '): """ Замедленный вывод текста в консоли """ text = str_join.join(str(x) for x in args) n = len(text) for i, char in enumerate(text, 1): # если количество символов # равно текущему счетчику. if i == n: # печать последнего символа с переводом строки '\n' char = f'char>\n' sys.stdout.write(char) sys.stdout.flush() time.sleep(delay) >>> teleprint('Привет Python!') # Привет Python! >>>
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Как работает функция enumerate() в Python?
В данной статье мы бы хотели разобрать, как работает функция enumerate() в Python. Сначала мы рассмотрим её синтаксис и принцип работы, а дальше потренируемся на примерах, чтобы научиться использовать данную функцию на практике.
Итак, функция enumerate() в Python принимает некий набор данных в качестве параметра и возвращает объект enumerate.
Этот объект возвращается в формате пар ключ-значение, где ключи — это соответствующие индексы элементов, а значения — сами элементы из переданного набора данных.
Но давайте сперва поговорим о синтаксисе и параметрах функции enumerate().
Синтаксис функции enumerate() в Python
Синтаксис функции enumerate() выглядит следующим образом:
Функция enumerate() принимает два параметра: iterable и start .
- iterable — это итерируемый объект (список, кортеж и т.д.), который будет возвращен в виде пронумерованного объекта (объекта enumerate)
- start — это начальный индекс для возвращаемого объекта enumerate. Значение по умолчанию равно 0, поэтому, если вы опустите этот параметр, в качестве первого индекса будет использоваться 0.
Как использовать функцию enumerate() в Python
В этом разделе мы рассмотрим несколько примеров, которые помогут нам понять синтаксис и параметры, разобранные в предыдущем разделе.
Обратите внимание, что при использовании enumerate() нужно указывать тип данных, в котором будет храниться наш объект enumerate при возврате (это может быть список, множество и т.д.). Вы лучше поймете это, когда мы рассмотрим примеры.
Пример №1: функция enumerate() с одним параметром
names = ["John", "Jane", "Doe"] enumNames = enumerate(names) print(list(enumNames)) # [(0, 'John'), (1, 'Jane'), (2, 'Doe')]
В приведенном выше примере мы создали список, состоящий из трех имен.
Затем мы преобразовали переменную names в объект enumerate и сохранили результат в переменной с именем enumNames .
Далее мы захотели, чтобы наш объект был выведен в виде списка, поэтому мы сделали следующее: list(enumNames) .
При выводе на консоль результат будет выглядеть так: [(0, ‘John’), (1, ‘Jane’), (2, ‘Doe’)] .
Как видите, результат мы получили в виде пар ключ-значение. Первый индекс — 0, он связан с первым элементом в нашем списке имен names , второй — 1, связан со вторым элементом в списке names и так далее.
Обратим внимание, что в нашем примере мы использовали только первый параметр функции enumerate().
В следующем примере мы используем оба параметра, чтобы вы увидели разницу.
Пример №2: функция enumerate() с указанием начального индекса
names = ["John", "Jane", "Doe"] enumNames = enumerate(names, 10) print(list(enumNames)) # [(10, 'John'), (11, 'Jane'), (12, 'Doe')]
Здесь мы добавили второй параметр в функцию enumerate() , написав enumerate(names, 10) .
Значение второго параметра, 10, будет начальным индексом для ключей (индексов) в объекте enumerate.
Результат будет таким: [(10, ‘John’), (11, ‘Jane’), (12, ‘Doe’)] .
Мы видим, что первый индекс равен 10, второй 11 и так далее. Таким образом, с помощью второго аргумента start мы можем установить любой начальный индекс для наших элементов.
Как перебрать результат функции enumerate() в Python
Вот простой пример, показывающий, как мы можем перебирать полученный в результате объект enumerate:
names = ["John", "Jane", "Doe"] enumNames = enumerate(names) for item in enumNames: print(item) # (0, 'John') # (1, 'Jane') # (2, 'Doe')
Используя цикл for , мы прошлись по нашему объекту с помощью следующей команды: for item in enumNames . Подробнее про тонкости использования цикла for можете узнать в статье «Цикл for в Python: тонкости написания».
На выходе мы получили элементы исходного объекта, выведенные в формате пар ключ-значение.
Заключение
Итак, в этой статье мы поговорили о том, как работает функция enumerate() в Python. Мы начали с рассмотрения синтаксиса и параметров этой функции, затем разобрали несколько примеров ее использования.
Наконец, мы увидели, как можно перебирать вывод функции enumerate() с помощью цикла for .
Надеемся, данная статья была вам полезна! Успехов в написании кода!
Функция enumerate
В языке программирования Python 3 есть встроенная функция enumerate. Периодически требуется пройти по элементам списка и при этом обрабатывать не только значение элемента, но так же и его порядковый номер в списке. Вот в этом случае она и понадобится.
Аргументы
Аргументов у функции enumerate два:
- Объект, элементы которого будем перебирать. Необязательно это должен быть список, это может быть, например, множество или словарь.
- Начальное значение индекса (start). По умолчанию начальное значение равно 0.
Возвращает итератор на кортеж из двух элементов: индекс и элемент объекта.
Пример использования
Вот пример использования. С помощью enumerate мы перебираем весь список data . При переборе мы получали кортеж, состоящий из двух элементов. В переменной num будет порядковый номер элемента в списке. В переменной val – значение элемента. В качестве второго аргумента в функции enumerate мы использовали цифру 1, чтобы индексы начинались с единицы, а не с нуля.
data = [2, 5, 3, 4, 1, 5] for num, val in enumerate(data, 1): print(str(num) + '-ое значение равно ' + str(val)) 1-ое значение равно 2 2-ое значение равно 5 3-ое значение равно 3 4-ое значение равно 4 5-ое значение равно 1 6-ое значение равно 5
Без использования enumerate
Если не использовать enumerate в Python 3, то можно сделать свой счетчик. Задать ему начальное значение и при каждом проходе цикла его увеличивать. Например, следующим образом.
colors = ['red', 'green', 'blue'] ind = 1 for color in colors: print(str(ind) + '-й цвет: ' + color) ind += 1 1-й цвет: red 2-й цвет: green 3-й цвет: blue
Но раз есть в Python 3 такая функция, как enumerate, то ей надо пользоваться. Она упрощает код, делает его более понятным.
Использование next
Функция enumerate возвращает итератор. Используя функцию next можно получить кортежи.
a = [2, 5, 3, 4, 1, 5] b = enumerate(a) c = next(b) print(c) print(type(c)) print(next(b)) (0, 2) (1, 5)
Если при очередном вызове next, следующий элемент будет отсутствовать, возникает исключение StopIteration. Подробнее про типы исключений и как их обрабатывать есть отдельная статья на сайте.
