Enumerate python что это
Перейти к содержимому

Enumerate python что это

  • автор:

Функция 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()

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

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

names = ['Bob', 'Alice', 'Guido'] for index, value in enumerate(names): print(f': ') 

Этот код вернёт результат:

0: Bob 1: Alice 2: Guido 

Производится итерация по списку names и генерация индекса для каждого элемента, увеличивая переменную счётчика, начиная с нуля.

Сделайте свои циклы более питоническими с enumerate()

Некоторые начинающие Python разработчики, пришедшие из C или Java, иногда используют range(len (. )) антипаттерн, чтобы поддерживать индекс во время итерации по списку с помощью цикла for :

# Антипаттерн! Не делайте так. for i in range(len(my_items)): print(i, my_items[i]) 

С помощью функции enumerate() можно сделать эту циклическую конструкцию гораздо более «питонической» и идиоматической.

Обычно нет необходимости создавать индексы элементов вручную в Python – достаточно просто поручить эту работу функции enumerate() . И в результате код будет легче читаем и менее уязвим для опечаток.

Изменение стартового индекса

Ещё одна полезная функция – возможность выбора начального индекса для перечисления. Функция enumerate() принимает необязательный аргумент, который позволяет установить начальное значение для внутренней переменной счетчика:

names = ['Bob', 'Alice', 'Guido'] for index, value in enumerate(names, 1): print(f': ') 

В приведенном выше примере вызов функции заменён на enumerate(names, 1), а дополнительный аргумент теперь начинает индексирование с единицы вместо нуля:

1: Bob 2: Alice 3: Guido 

Как enumerate() работает за кулисами

Рассмотрим более подробно, как функция enumerate() работает за кулисами. Часть её магии заключается в том, что enumerate() реализована как итератор Python. Это означает, что индексы элементов генерируются лениво, сохраняя низкое потребление памяти и ускоряя выполнение программы.

>>> names = ['Bob', 'Alice', 'Guido'] >>> enumerate(names)

В приведенном выше фрагменте кода выполняется то же перечисление, которое было приведёно в предыдущих примерах. Но вместо того, чтобы сразу перебирать результат вызова enumerate() , просто распечатывается возвращаемый объект в консоль Python.

Как вы можете видеть – это «enumerate object». Фактическии – это итератор. И, как уже было сказано, он генерирует свои выходные элементы лениво и один за другим, только когда их запрашивают.

Чтобы получить элементы «по требованию» достаточно вызвать встроенную функцию list() на итераторе:

>>> list(enumerate(names)) [(0, 'Bob'), (1, 'Alice'), (2, 'Guido')] 

Для каждого элемента во входном списке names итератор, возвращаемый enumerate() , создаёт кортеж формы (индекс, элемент).

Выводы

  • enumerate — это встроенная функция Python, используемая для циклического перебора с автоматической индексацией, сгенерированной переменной счётчиком.
  • По умолчанию счётчик начинается с 0, но можно установить его в любое целое число.
  • enumerate была добавлена в Python начиная с версии 2.3 (PEP 279).
  • Функция enumerate на языке Python помогает вам писать больше питоновских и идиоматических циклов, которые избегают использования неумелого и подверженного ошибкам ручного индексирования.
  • Чтобы использовать enumerate в полном объеме, обязательно изучите возможности итераторов 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 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. Подробнее про типы исключений и как их обрабатывать есть отдельная статья на сайте.

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

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