Coursera Learner working on a presentation with Coursera logo and
Coursera Learner working on a presentation with Coursera logo and

W języku Python programiści często używają pętli for do tworzenia pętli na obiekcie iterowalnym. Zasadniczo oznacza to, że nie będzie potrzebna zmienna zliczająca do dostępu do elementów wewnątrz iterowalnej. W niektórych przypadkach programiści potrzebują jednak zmiennej, która może się zmieniać przy każdej iteracji pętli. Zamiast tworzyć i zwiększać zmienne, zawsze można użyć funkcji enumerate () do uzyskania licznika i wartości jednocześnie.

Iteracja za pomocą pętli w Pythonie

Pętla for Pythona wykorzystuje iterację opartą na kolekcji, co oznacza, że Python ma tendencję do przypisywania elementu do zmiennych pętli ( z iterables) w każdej pojedynczej iteracji. Oto przykład.

Wartości w tym przykładzie to lista zawierająca 3 ciągi znaków, którymi są litery a, b i c. W programie Pythona listy są traktowane jako warianty obiektów iterowalnych. Zmienną występującą w pętli for jest value. Warto również pamiętać, że przy każdej iteracji pętli wartość jest ustawiana na następny element i pochodzi z wartości poleceń.

Następnie należy rozpocząć wypisywanie wartości na ekran. Jedną z głównych zalet iteracji opartej na kolekcji jest to, że pozwala ona uniknąć błędów typu “off by one”, które są powszechnie spotykane w wielu innych językach programowania.

Załóżmy, że oprócz wartości planujesz wypisywać na ekranie indeks elementu w każdej iteracji. Efektywnym sposobem podejścia do tego zadania jest utworzenie zmiennej do przechowywania indeksu. Gdy już to zrobisz, możesz ją aktualizować przy każdej iteracji, co będzie wyglądało mniej więcej tak:

W powyższym przykładzie indeks jest w istocie liczbą całkowitą przechowującą informacje o pozycji użytkownika na liście. Przy każdej iteracji pętli będziesz wypisywał indeks wraz z wartością. Ostatni krok w pętli będzie wymagał zaktualizowania liczby znajdującej się w indeksie (upewnij się, że zaktualizowałeś ją o jeden). Zauważysz błąd za każdym razem, gdy nie zaktualizujesz indeksu w każdej iteracji. Oto, jak mogłoby to wyglądać

W przykładzie widać, że każdy indeks w każdej iteracji pozostaje na poziomie 0. Dzieje się tak dlatego, że jego wartość nie została zaktualizowana przez kod na końcu pętli. Wytropienie takiego błędu może być bardzo trudne, szczególnie w przypadku skomplikowanych i dłuższych pętli.
Skutecznym sposobem na rozwiązanie tego problemu jest połączenie funkcji range() i len() w celu utworzenia indeksu. Powodem, dla którego ta taktyka jest często zalecana, jest fakt, że pomaga ona tworzyć indeksy automatycznie, dzięki czemu nie trzeba pamiętać, kiedy należy dokonać aktualizacji.

Używanie enumerate() w Pythonie we właściwy sposób

Programiści mogą korzystać z funkcji enumerate() w ramach pojedynczej pętli tak samo, jak korzystaliby z początkowego obiektu iterable. Zamiast dodawać iterowalną bezpośrednio po in present in for, umieścisz ją w nawiasie polecenia enumerate(). Ponadto trzeba będzie dokonać niewielkich zmian w zmiennej pętli. Poniżej znajduje się przykład, który pokazuje, jak to będzie wyglądać:

Po wpisaniu polecenia enumerate() otrzymasz od funkcji dwie zmienne pętli, które będą się składać z licznika bieżącej iteracji oraz wartości elementu bieżącej iteracji.

Podobnie jak w przypadku zwykłej pętli for, zmiennym pętli można nadać dowolną nazwę. W powyższym przykładzie użyto słów value i count. Można jednak nadać im również nazwy v oraz i lub dowolną inną, o ile jest ona poprawna w Pythonie.

Używając funkcji enumerate (), nie musisz pamiętać, kiedy uzyskać dostęp do elementu w iterowalnej. Co sprawia, że jest jeszcze lepiej, to fakt, że nie trzeba pamiętać o zwiększaniu indeksu obecnego na końcu pętli. Python zajmuje się prawie wszystkim automatycznie, dzięki czemu nie musisz się martwić o pamiętanie o istotnych szczegółach.

Ważna uwaga

Użycie dwóch zmiennych pętli, którymi są value i count, z jednoczesnym oddzieleniem ich przecinkiem jest przykładem rozpakowywania argumentów. Jest to niezwykle potężna funkcja w Pythonie.

Funkcja enumerate() w Pythonie ma dodatkowy argument, którego programiści mogą użyć do kontrolowania wartości początkowej licznika. Tak się składa, że domyślnie wartość początkowa wynosi zero. Dzieje się tak, ponieważ sekwencje w Pythonie są indeksowane i wszystkie zaczynają się od 0. Mówiąc prościej, jeśli chcesz pobrać początkowy element listy, wybierz indeks 0.
Właściwe wykorzystanie funkcji enumerate() w Pythonie

Programiści mogą korzystać z funkcji enumerate() zawsze wtedy, gdy chcą użyć elementu i licznika w pętli. Warto pamiętać, że użycie funkcji enumerate() zasadniczo zwiększa ogólną liczbę elementów o 1 w każdej iteracji. Nie spowoduje to jednak zbytniej nieelastyczności. W rzeczywistości możesz pozostać dość elastyczny, ponieważ wyliczenie jest zwykłą liczbą całkowitą Pythona, którą możesz wykorzystać na wiele sposobów.

Wewnętrzne działanie funkcji enumerate() w Pythonie

Aby lepiej zrozumieć, jak działa funkcja enumerate(), najlepiej będzie zaimplementować jej wersję w Pythonie. W Twojej wersji enumerate() będą dwa krytyczne wymagania. Oto one:

– Rozpocznij od przyjęcia jako argumentów początkowej wartości licznika i iterowalnej
– Wysłać z powrotem tuple, upewniając się, że zawiera ona aktualną wartość count wraz z elementem powiązanym z iterable

W powyższym przykładzie funkcja my_enumerate używa dwóch argumentów, startu i sekwencji, przy czym domyślną wartością startu jest zero. W definicji funkcji, podczas wykonywania pętli for na sekwencji, należy użyć n jako wartości start. Dla każdego elementu znajdującego się w sekwencji należy przekazać sterowanie do odpowiedniego miejsca. Po wykonaniu tego kroku należy odesłać aktualne wartości elem i n. Na koniec inkrementuj polecenie n, aby przygotować się do następnej iteracji.

Jeśli chcesz wyliczać w Pythonie jak biegły programista, znajomość podstaw jest niezbędna. Informacje i przykłady podane w tym rozdziale pozwolą Ci zorientować się, jak prawidłowo wykonywać wyliczenia.

Języki

Weekly newsletter

No spam. Just the latest releases and tips, interesting articles, and exclusive interviews in your inbox every week.