Функція Python enumerate(), пояснена на прикладах

Цей підручник навчить вас, як використовувати функцію 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.

Тепер, використовуючи цей синтаксис, давайте прокрутимо список покупок і отримаємо доступ до окремих елементів.

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(). Про це ми дізнаємося в наступному розділі.

  Як зробити ярлики Chrome «відкритими як вікно» (тепер, коли Google їх убив)

Як використовувати функцію 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(), коли вам потрібно виконати цикл великих ітерацій.

Приклади функцій Python enumerate().

Тепер, коли ми вивчили синтаксис використання функції 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, установіть start = 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

Щоб уникнути таких помилок, ви можете вказати start як аргумент ключового слова, як показано нижче.

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. Ви також можете використовувати функцію enumerate для циклічного перегляду рядків, словників і кортежів Python.

Як використовувати функцію enumerate() із кортежами Python

Припустимо, 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), щоб отримати індекс, починаючи з початкового значення та відповідних елементів.
  • Ви можете використовувати функцію enumerate під час роботи з кортежами, рядками, словниками та взагалі з будь-яким ітерованим Python.

Сподіваюся, цей посібник із функції enumerate() був для вас корисним. Далі дізнайтеся, як знайти індекс елемента в списках Python. Продовжуйте кодувати!

  Що таке Spotify Kids? (і як використовувати його батьківський контроль)