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.