Функцыя Python enumerate() з тлумачэннем на прыкладах

Гэты падручнік навучыць вас карыстацца функцыяй enumerate() у Python.

Функцыя enumerate() у Python забяспечвае кароткі сінтаксіс для доступу да элементаў у iterable разам з іх індэксамі.

Мы пачнем з разгляду таго, як атрымаць доступ да элементаў і індэксаў з дапамогай простага цыклу, а потым пяройдзем да вывучэння сінтаксісу функцыі 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(). Мы даведаемся пра гэта ў наступным раздзеле.

Праверце гэта:  Інтэрнэт-інструмент рашэння алгебры, які дае пакрокавыя інструкцыі

Як выкарыстоўваць функцыю range() для доступу да індэкса

Убудаваная ў Python функцыя len() вяртае даўжыню любога аб’екта 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 – неабавязковы параметр, які кантралюе індэкс, з якога пачынаецца падлік. Калі вы не ўкажаце значэнне 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(). з аб’ектам пералічэння ў якасці аргумента. У 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

Аднак, указваючы карыстацкае пачатковае значэнне, вы павінны быць упэўнены, што вы ўказваеце яго ў якасці другога пазіцыйнага аргумента.

Калі вы памылкова памяняеце парадак iterable і пачатковага значэння, вы сутыкнецеся з памылкай, як тлумачыцца ў ячэйцы кода ніжэй.

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

Выкажам здагадку, што 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

Вы таксама можаце выкарыстоўваць функцыю Python enumerate() для прагляду радкоў і доступу да сімвалаў і індэксаў адначасова.

Вось прыклад.

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 вы можаце выкарыстоўваць функцыю Python enumerate() з сінтаксісам: enumerate(iterable). Па змаўчанні падлік або індэкс пачынаецца з 0.
  • Вы можаце задаць карыстацкае пачатковае значэнне з дапамогай сінтаксісу enumerate(iterable, start), каб атрымаць індэкс, пачынаючы з пачатку значэння і адпаведных элементаў.
  • Вы можаце выкарыстоўваць функцыю пералічэння пры працы з картэжамі, радкамі, слоўнікамі і ўвогуле з любым ітэрам Python.

Спадзяюся, вы знайшлі гэты падручнік па функцыі enumerate() карысным. Далей даведайцеся, як знайсці індэкс элемента ў спісах Python. Працягвайце кадзіраваць!