Цей підручник навчить вас, як використовувати функцію 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(). Про це ми дізнаємося в наступному розділі.
Як використовувати функцію 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. Продовжуйте кодувати!