Функция enumerate() на Python, обяснена с примери

Този урок ще ви научи как да използвате функцията enumerate() в Python.

Функцията enumerate() в Python предоставя кратък синтаксис за достъп до елементите в итерируем заедно с техните индекси.

Ще започнем с преглед на това как да осъществяваме достъп до елементи и индекси с помощта на прост цикъл и след това ще продължим да изучаваме синтаксиса на функцията enumerate() на Python. Освен това ще кодираме примери по пътя.

Нека да започнем.

Как да итерирате с помощта на for цикъл в Python

Всеки обект на Python, който можете да повторите и да получите достъп до отделните елементи – един по един, се нарича итерируем. Следователно списъците на Python, кортежите, речниците и низовете са итерируеми.

Нека вземем пример за списък за пазаруване, дефиниран в клетката с код по-долу.

shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"]

В Python можете да използвате for цикъла, за да преминете през всеки итерируем. Синтаксисът за това е следният:

for item in <iterable>:
    # do something on item

# item: looping variable
# <iterable>: any Python iterable: list, tuple, dictionary, string, and so on.

Сега, използвайки този синтаксис, нека преминем през shopping_list и да получим достъп до отделните елементи.

for item in shopping_list:
  print(item)

# Output
fruits
cookies
cereals
protein bars
post-it notes

Тази конструкция ви помага да имате директен достъп до елементите. Въпреки това, понякога може да се наложи да получите достъп до индекса на елементите, в допълнение към самите елементи.

Можете да използвате индексна променлива, която можете да увеличите вътре в тялото на цикъла, както е показано по-долу:

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  index += 1

# Output
index:0, fruits
index:1, cookies
index:2, cereals
index:3, protein bars
index:4, post-it notes

Но това не е най-ефективният метод. Ако не си спомните да увеличите индекса, кодът ви няма да работи според очакванията.

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  # no update of index inside loop body
  # index is never updated and is always 0

# Output
index:0, fruits
index:0, cookies
index:0, cereals
index:0, protein bars
index:0, post-it notes

Друг общ модел за използване на цикъла for е във връзка с функцията range(). Ще научим за това в следващия раздел.

  Как да създавате събития в календара от поща на iPhone и iPad

Как да използвате функцията range() за достъп до индекс

Вградената функция len() на Python връща дължината на всеки обект на Python. Така че можете да извикате функцията len() с shopping_list аргумента, за да получите дължината на shopping_list (която е 5 в този случай).

len(shopping_list)
# Output: 5

Функцията range() връща обект от диапазон, който след това можете да използвате в цикъл. Когато преминавате през диапазон (стоп), получавате индексите 0, 1, 2,…, стоп-1.

Като зададете stop = len(list), можете да получите списъка с валидни индекси. Така че, като използвате функцията range(), можете да получите достъп до индекса, както и до съответния елемент, както е показано по-долу.

for index in range(len(shopping_list)):
  print(f"index:{index}, item: {shopping_list[index]}")

# Output
index:0, item: fruits
index:1, item: cookies
index:2, item: cereals
index:3, item: protein bars
index:4, item: post-it notes

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

Синтаксис на функцията enumerate() на Python

Функцията enumerate() на Python ви позволява да осъществявате достъп до елементите заедно с техните индекси, като използвате следния общ синтаксис:

enumerate(<iterable>, start = 0)

В горния синтаксис:

  • е задължителен параметър и може да бъде всеки итерируем на Python, като списък или кортеж.
  • start е незадължителен параметър, който контролира индекса, от който започва броенето. Ако не посочите началната стойност, тя по подразбиране е нула.

Вече можете да извикате функцията enumerate() с shopping_list и тя връща обект enumerate, както е показано в клетката с код по-долу.

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

Не можете да преминете през обекта enumerate. Така че нека преобразуваме обекта enumerate в списък на Python.

list(enumerate(shopping_list))

# Output
[(0, 'fruits'),
 (1, 'cookies'),
 (2, 'cereals'),
 (3, 'protein bars'),
 (4, 'post-it notes')]

Друг метод за достъп до елементите на обекта enumerate е да извикате next() функция с обекта enumerate като аргумент. В Python функцията next() връща следващия елемент от итератор.

Вътрешно функцията next() работи, като извиква метода __next__ на обекта на итератора, за да извлече последователните елементи.

Нека присвоим обекта enumerate на променливата shopping_list_enum.

shopping_list_enum = enumerate(shopping_list)

Когато за първи път извикате next() с shopping_list_enum, ще получите индекс нула и елемента с индекс 0: кортежът (0, ‘плодове’).

Когато продължите да правите по-нататъшни извиквания към функцията next(), ще получите последователните елементи заедно с техните индекси, както е описано по-долу.

next(shopping_list_enum)
# (0, 'fruits')
next(shopping_list_enum)
# (1, 'cookies')
next(shopping_list_enum)
# (2, 'cereals')
next(shopping_list_enum)
# (3, 'protein bars')
next(shopping_list_enum)
# (4, 'post-it notes')

Какво се случва, ако извикате функцията next(), след като сте осъществили достъп до всички елементи и сте достигнали края на списъка? Получавате грешка StopIteration.

next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)

StopIteration:

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

Примери за функция enumerate() на Python

Сега, след като научихме синтаксиса за използване на функцията enumerate(), нека модифицираме for цикъла, който имахме по-рано.

От предишния раздел знаем, че преминаването през обекта enumerate връща кортеж с индекса и елемента. Можем да разопаковаме този кортеж в две променливи: индекс и елемент.

for index, item in enumerate(shopping_list):
  print(f"index:{index}, item:{item}")

# Output
index:0, item:fruits
index:1, item:cookies
index:2, item:cereals
index:3, item:protein bars
index:4, item:post-it notes

След това нека видим как да зададете персонализирана начална стойност.

Как да enumerate() с персонализирана начална стойност

Python следва нулево индексиране, така че началната стойност е 0 по подразбиране. Въпреки това, ако имате нужда от индексите в четима от човека форма – започвайки от 1 или друг индекс по ваш избор, можете да посочите персонализирана начална стойност.

В примера shopping_list, ако искате да започнете да броите от 1, задайте начало = 1.

for index, item in enumerate(shopping_list,1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Въпреки това, когато посочвате персонализираната начална стойност, трябва да сте сигурни, че сте я посочили като втори позиционен аргумент.

Ако погрешно размените реда на итерируемия и началната стойност, ще попаднете на грешка, както е обяснено в клетката с код по-долу.

for index, item in enumerate(1,shopping_list):
  print(f"index:{index}, item:{item}")

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
      2   print(f"index:{index}, item:{item}")

TypeError: 'list' object cannot be interpreted as an integer

За да избегнете такива грешки, можете да посочите начало като аргумент на ключова дума, както е показано по-долу.

for index, item in enumerate(shopping_list, start = 1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Досега научихте как да използвате функцията enumerate() със списъци на Python. Можете също да използвате функцията за изброяване, за да преминете през Python низове, речници и кортежи.

Как да използвате функцията enumerate() с Python Tuples

Да предположим, че shopping_list е кортеж. В Python кортежите също са колекции – подобно на списъците на Python, но те са неизменни. Следователно не можете да ги промените и опитът да го направите ще доведе до грешка.

Следният кодов фрагмент инициализира shopping_list като кортеж.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
type(shopping_list)
# Tuple

Ако се опитате да промените първия елемент в кортежа, ще получите грешка, тъй като кортежът на Python е неизменна колекция.

shopping_list[0] = 'vegetables'

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = 'vegetables'

TypeError: 'tuple' object does not support item assignment

▶ Сега изпълнете следния кодов фрагмент, за да проверите дали функцията enumerate() работи според очакванията с кортежи.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
for index, item in enumerate(shopping_list):
    print(f"index:{index}, item:{item}")

Как да използвате функцията enumerate() с низове на Python

Можете също да използвате функцията enumerate() на Python, за да преминете през низове и да получите достъп до знаците и индексите едновременно.

Ето един пример.

py_str="Butterfly"
for index, char in enumerate(py_str):
  print(f"index {index}: {char}")

# Output
index 0: B
index 1: u
index 2: t
index 3: t
index 4: e
index 5: r
index 6: f
index 7: l
index 8: y

От изхода по-горе виждаме, че знаците заедно с техните индекси (0-8) са отпечатани.

Заключение👩🏽‍💻

Ето обобщение на това, което сте научили.

  • Можете да използвате for цикли за достъп до елементите и да поддържате отделен брояч или индексна променлива.
  • Ако желаете, можете да използвате функцията range(), за да получите валидните индекси и да получите достъп до елементите чрез индексиране в списъка.
  • Като препоръчителен начин на Python можете да използвате функцията enumerate() на Python със синтаксиса: enumerate(iterable). По подразбиране броят или индексът започва от 0.
  • Можете да посочите персонализираната начална стойност със синтаксиса enumerate(iterable, start), за да получите индекса, започващ от началната стойност и съответните елементи.
  • Можете да използвате функцията за изброяване, когато работите с кортежи, низове, речници и като цяло всеки итерируем Python.

Надявам се, че сте намерили този урок за функцията enumerate() за полезен. След това научете как да намерите индекса на елемент в списъците на Python. Продължавай да кодираш!

  Как да работите с линиите на тенденцията в диаграмите на Microsoft Excel
x