Что делает метод enumerate python?
enumerate() это скорее функция, нежели метод. Данная функция возвращает так называемый enumerate object из переданного ей итерируемого объекта. Этот enumerate object состоит из кортежей, первый элемент которого — порядковый номер элемента итерируемого объекта (по умолчанию это 0), а второй — сам элемент. Работает это следующим образом:
x = ('apple', 'banana', 'cherry') y = enumerate(x) print(list(y)) # => [(0, 'apple'), (1, 'banana'), (2, 'cherry')]
Функция enumerate() может принимать целое число вторым необязательным аргументом. С этого числа и будет вестись отсчет:
x = ('apple', 'banana', 'cherry') y = enumerate(x, 2) print(list(y)) # => [(2, 'apple'), (3, 'banana'), (4, 'cherry')]
Функция 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. Подробнее про типы исключений и как их обрабатывать есть отдельная статья на сайте.
Функция enumerate() Python
enumerate() — это встроенная функция в Python, которая позволяет вам иметь автоматический счетчик во время цикла по итерациям.
Функция enumerate()
Функция enumerate() принимает следующий вид:
enumerate(iterable, start=0)
Функция принимает два аргумента:
- iterable — объект, поддерживающий итерацию.
- start — число, с которого начинается счетчик. Это необязательный аргумент. По умолчанию счетчик начинается с 0.
enumerate() возвращает объект перечисления, для которого вы можете вызвать метод __next__() (или next() в Python 2), чтобы получить кортеж, содержащий счетчик и текущее значение итерируемого.
Вот пример того, как создать список кортежей с помощью list() и как перебрать итерацию:
directions = ["north", "east", "south", "west"] list(enumerate(directions)) for index, value in enumerate(directions): print("<>: <>".format(index, value))
[(0, 'north'), (1, 'east'), (2, 'south'), (3, 'west')] 0: north 1: east 2: south 3: west
Если индексирование с нулевым отсчетом у вас не работает, выберите другой начальный индекс для перечисления:
directions = ["north", "east", "south", "west"] list(enumerate(directions, 1))
[(1, 'north'), (2, 'east'), (3, 'south'), (4, 'west')]
Функция enumerate() работает с любым итерируемым объектом. Итерируемый объект — это контейнер, который можно повторять. Проще говоря, это означает объект, который можно перебрать с помощью цикла for . Большинство встроенных объектов в Python, таких как строки, списки и кортежи, являются повторяемыми.
Больше о enumerate()
Цикл for Python полностью отличается от традиционного цикла for стиле C, который доступен во многих языках программирования. Цикл for в Python эквивалентен циклу foreach в других языках.
Обычный метод, используемый новыми разработчиками Python для получения соответствующего индекса при работе с итерациями, заключается в использовании либо шаблона range(len(. )) , либо установки и увеличения счетчика:
planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"] for i in range(len(planets)): print("Planet <>: <>".format(i, planets[i]))
planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"] i = 0 for planet in planets: print("Planet <>: <>".format(i, planet)) i += 1
Приведенные выше циклы можно переписать более идиоматическим способом с помощью enumerate() :
planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"] for index, value in enumerate(planets): print("Planet <>: <>".format(index, value))
Все методы будут давать одинаковый результат:
Planet 0: Mercury Planet 1: Venus Planet 2: Earth Planet 3: Mars Planet 4: Jupiter Planet 5: Saturn Planet 6: Uranus Planet 7: Neptune
Выводы
В этой статье мы показали вам, как использовать функцию Python enumerate() .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
enumerate#
Иногда, при переборе объектов в цикле for, нужно не только получить сам объект, но и его порядковый номер. Это можно сделать, создав дополнительную переменную, которая будет расти на единицу с каждым прохождением цикла. Однако, гораздо удобнее это делать с помощью итератора enumerate .
In [15]: list1 = ['str1', 'str2', 'str3'] In [16]: for position, string in enumerate(list1): . : print(position, string) . : 0 str1 1 str2 2 str3
enumerate умеет считать не только с нуля, но и с любого значение, которое ему указали после объекта:
In [17]: list1 = ['str1', 'str2', 'str3'] In [18]: for position, string in enumerate(list1, 100): . : print(position, string) . : 100 str1 101 str2 102 str3
Иногда нужно проверить, что сгенерировал итератор, как правило, на стадии написания скрипта. Если необходимо увидеть содержимое, которое сгенерирует итератор, полностью, можно воспользоваться функцией list:
In [19]: list1 = ['str1', 'str2', 'str3'] In [20]: list(enumerate(list1, 100)) Out[20]: [(100, 'str1'), (101, 'str2'), (102, 'str3')]
Пример использования enumerate для EEM#
В этом примере используется Cisco EEM. Если в двух словах, то EEM позволяет выполнять какие-то действия (action) в ответ на событие (event).
Выглядит applet EEM так:
event manager applet Fa0/1_no_shut event syslog pattern "Line protocol on Interface FastEthernet0/0, changed state to down" action 1 cli command "enable" action 2 cli command "conf t" action 3 cli command "interface fa0/1" action 4 cli command "no sh"
В EEM, в ситуации, когда действий выполнить нужно много, неудобно каждый раз набирать action x cli command . Плюс, чаще всего, уже есть готовый кусок конфигурации, который должен выполнить EEM.
С помощью простого Python-скрипта можно сгенерировать команды EEM на основании существующего списка команд (файл enumerate_eem.py):
import sys config = sys.argv[1] with open(config, 'r') as f: for i, command in enumerate(f, 1): print('action cli command "<>"'.format(i, command.rstrip()))
В данном примере команды считываются из файла, а затем к каждой строке добавляется приставка, которая нужна для EEM.
Файл с командами выглядит так (r1_config.txt):
en conf t no int Gi0/0/0.300 no int Gi0/0/0.301 no int Gi0/0/0.302 int range gi0/0/0-2 channel-group 1 mode active interface Port-channel1.300 encapsulation dot1Q 300 vrf forwarding Management ip address 10.16.19.35 255.255.255.248
Вывод будет таким:
$ python enumerate_eem.py r1_config.txt action 0001 cli command "en" action 0002 cli command "conf t" action 0003 cli command "no int Gi0/0/0.300" action 0004 cli command "no int Gi0/0/0.301" action 0005 cli command "no int Gi0/0/0.302" action 0006 cli command "int range gi0/0/0-2" action 0007 cli command " channel-group 1 mode active" action 0008 cli command "interface Port-channel1.300" action 0009 cli command " encapsulation dot1Q 300" action 0010 cli command " vrf forwarding Management" action 0011 cli command " ip address 10.16.19.35 255.255.255.248"