Funkcja enumerate() w języku Python, wyjaśniona przykładami

Ten samouczek nauczy Cię, jak używać funkcji enumerate() w Pythonie.

Funkcja enumerate() w Pythonie zapewnia zwięzłą składnię dostępu do elementów w iterowalnym wraz z ich indeksami.

Zaczniemy od omówienia, jak uzyskać dostęp do pozycji i indeksów za pomocą prostej pętli, a następnie przejdziemy do nauki składni funkcji enumerate() Pythona. Po drodze będziemy też kodować przykłady.

Zaczynajmy.

Jak iterować za pomocą pętli for w Pythonie

Każdy obiekt Pythona, po którym możesz iterować i uzyskiwać dostęp do poszczególnych elementów — jeden po drugim, jest nazywany iterowalnym. Dlatego listy, krotki, słowniki i łańcuchy Pythona są iterowalne.

Weźmy przykład listy zakupów zdefiniowanej w komórce kodu poniżej.

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

W Pythonie możesz użyć pętli for do zapętlenia dowolnego elementu iteracyjnego. Składnia do tego jest następująca:

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

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

Teraz, korzystając z tej składni, przejdźmy przez listę_zakupów i uzyskajmy dostęp do poszczególnych pozycji.

for item in shopping_list:
  print(item)

# Output
fruits
cookies
cereals
protein bars
post-it notes

Ta konstrukcja pomaga w bezpośrednim dostępie do elementów. Czasami jednak może być potrzebny dostęp do indeksu elementów, oprócz samych elementów.

Możesz użyć zmiennej indeksującej, którą możesz zwiększać wewnątrz ciała pętli, jak pokazano poniżej:

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

Ale to nie jest najskuteczniejsza metoda. Jeśli nie pamiętasz o zwiększaniu indeksu, Twój kod nie będzie działał zgodnie z oczekiwaniami.

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

Innym powszechnym wzorcem używania pętli for jest połączenie z funkcją range() . Dowiemy się o tym w następnej sekcji.

Jak używać funkcji range() w celu uzyskania dostępu do indeksu

Wbudowana w Pythona funkcja len() zwraca długość dowolnego obiektu Pythona. Możesz więc wywołać funkcję len() z argumentem shopping_list, aby uzyskać długość listy shopping_list (w tym przypadku jest to 5).

len(shopping_list)
# Output: 5

Funkcja range() zwraca obiekt zakresu, którego można następnie użyć w pętli. Kiedy przejdziesz przez zakres (stop), otrzymasz indeksy 0, 1, 2,…, stop-1.

Ustawiając stop = len(list), możesz uzyskać listę ważnych indeksów. Używając funkcji range(), możesz uzyskać dostęp do indeksu, jak również do odpowiedniego elementu, jak pokazano poniżej.

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

Jednak nie jest to zalecany w Pythonie sposób jednoczesnego uzyskiwania dostępu do indeksów i pozycji.

Składnia funkcji enumerate() w języku Python

Funkcja enumerate() Pythona umożliwia dostęp do elementów wraz z ich indeksami przy użyciu następującej ogólnej składni:

enumerate(<iterable>, start = 0)

W powyższej składni:

  • jest wymaganym parametrem i może to być dowolny iterowalny Python, taki jak lista lub krotka.
  • start to opcjonalny parametr, który kontroluje indeks, od którego rozpoczyna się zliczanie. Jeśli nie określisz wartości start, domyślnie jest to zero.

Możesz teraz wywołać funkcję enumerate() z shopping_list i zwraca ona obiekt enumerate, jak pokazano w komórce kodu poniżej.

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

Nie można zapętlić obiektu enumerate. Przekształćmy więc obiekt enumerate w listę Pythona.

list(enumerate(shopping_list))

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

Inną metodą dostępu do elementów obiektu enumerate jest wywołanie funkcja next() z obiektem enumerate jako argumentem. W Pythonie funkcja next() zwraca następny element z iteratora.

Wewnętrznie funkcja next() działa poprzez wywołanie metody __next__ na obiekcie iteratora w celu pobrania kolejnych elementów.

Przypiszmy obiekt enumerate do zmiennej shopping_list_enum.

shopping_list_enum = enumerate(shopping_list)

Kiedy po raz pierwszy wywołasz next() z shopping_list_enum, otrzymasz indeks zero i element o indeksie 0: krotkę (0, 'owoce’).

Gdy będziesz kontynuować wykonywanie kolejnych wywołań funkcji next(), otrzymasz kolejne pozycje wraz z ich indeksami, jak opisano poniżej.

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')

Co się stanie, jeśli wywołasz funkcję next() po uzyskaniu dostępu do wszystkich elementów i dotarciu do końca listy? Otrzymujesz błąd StopIteration.

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

StopIteration:

Funkcja enumerate() zwraca kolejne indeksy i pozycje tylko wtedy, gdy są potrzebne i nie są obliczane z wyprzedzeniem. W projektach Pythona, w których musisz wziąć pod uwagę wydajność pamięci, możesz spróbować użyć funkcji enumerate(), gdy musisz przejść przez duże iterable.

Przykłady funkcji enumerate() w języku Python

Teraz, gdy nauczyliśmy się składni korzystania z funkcji enumerate(), zmodyfikujmy pętlę for, którą mieliśmy wcześniej.

Z poprzedniej sekcji wiemy, że pętla przez obiekt enumerate zwraca krotkę z indeksem i elementem. Tę krotkę możemy rozpakować do dwóch zmiennych: index i item.

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

Następnie zobaczmy, jak określić niestandardową wartość początkową.

Jak enumerate() z niestandardową wartością początkową

Python stosuje indeksowanie zerowe, więc domyślnie wartość początkowa wynosi 0. Jeśli jednak potrzebujesz indeksów w formie czytelnej dla człowieka — zaczynając od 1 lub dowolnego innego wybranego indeksu, możesz określić niestandardową wartość początkową.

W przykładzie lista_zakupów, jeśli chcesz zacząć liczyć od 1, ustaw 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

Jednak określając niestandardową wartość początkową, należy ją określić jako drugi argument pozycyjny.

Jeśli omyłkowo zamienisz kolejność iterowalności i wartości początkowej, napotkasz błąd, jak wyjaśniono w komórce kodu poniżej.

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

Aby uniknąć takich błędów, możesz określić start jako argument słowa kluczowego, jak pokazano poniżej.

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

Do tej pory nauczyłeś się używać funkcji enumerate() z listami Pythona. Możesz również użyć funkcji enumerate, aby przejść przez ciągi, słowniki i krotki Pythona.

Jak używać funkcji enumerate() z krotkami Pythona

Załóżmy, że lista_zakupów jest krotką. W Pythonie krotki są również kolekcjami — podobnie jak listy w Pythonie, ale są niezmienne. Dlatego nie możesz ich modyfikować, a próba zrobienia tego doprowadzi do błędu.

Poniższy fragment kodu inicjuje shopping_list jako krotkę.

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

Jeśli spróbujesz zmodyfikować pierwszy element w krotce, otrzymasz błąd, ponieważ krotka Pythona jest niezmienną kolekcją.

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

▶ Teraz uruchom poniższy fragment kodu, aby sprawdzić, czy funkcja enumerate() działa zgodnie z oczekiwaniami z krotkami.

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

Jak używać funkcji enumerate() z ciągami Pythona

Możesz również użyć funkcji enumerate() w języku Python, aby przechodzić przez ciągi i jednocześnie uzyskiwać dostęp do znaków i indeksów.

Oto przykład.

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

Z powyższego wyniku widzimy, że znaki wraz z ich indeksami (0-8) zostały wydrukowane.

Wniosek👩🏽‍💻

Oto podsumowanie tego, czego się nauczyłeś.

  • Możesz użyć pętli for, aby uzyskać dostęp do elementów i utrzymywać osobną zmienną licznika lub indeksu.
  • Jeśli chcesz, możesz użyć funkcji range(), aby uzyskać prawidłowe indeksy i uzyskać dostęp do elementów poprzez indeksowanie listy.
  • Jako zalecany sposób Pythona, możesz użyć funkcji enumerate() Pythona ze składnią: enumerate(iterable). Domyślnie liczba lub indeks zaczyna się od 0.
  • Możesz określić niestandardową wartość początkową za pomocą składni enumerate(iterable, start), aby uzyskać indeks rozpoczynający się od wartości start i odpowiednich elementów.
  • Funkcji enumerate można używać podczas pracy z krotkami, ciągami znaków, słownikami i ogólnie z dowolnymi iteracjami Pythona.

Mam nadzieję, że ten samouczek dotyczący funkcji enumerate() okazał się pomocny. Następnie dowiedz się, jak znaleźć indeks elementu w listach Pythona. Kontynuuj kodowanie!