Iteratory to fundamentalny koncept w Pythonie, który pozwala na przeglądanie kolekcji (takich jak listy, krotki, słowniki) element po elemencie. Cechą charakterystyczną iteratorów jest to, że pamiętają one swój aktualny stan podczas iteracji, co umożliwia wykonywanie operacji na kolejnych elementach kolekcji bez potrzeby śledzenia indeksu bieżącego elementu. W tym artykule przyjrzymy się bliżej, czym są iteratory i jak możemy tworzyć własne iteratory w Pythonie.
Przykład iteratora w Pythonie
Python udostępnia wbudowane metody iter()
i next()
, które pozwalają na tworzenie i manipulację iteratorami. Poniżej znajdziesz prosty przykład użycia tych metod:
# Tworzenie listy
my_list = [1, 2, 3, 4]
# Uzyskanie iteratora z listy
my_iterator = iter(my_list)
# Przechodzenie przez elementy za pomocą next()
print(next(my_iterator)) # Wyświetla 1
print(next(my_iterator)) # Wyświetla 2
Jak widać, metoda iter()
konwertuje listę na iterator, a next()
pozwala na sekwencyjne dostęp do kolejnych elementów iteratora.
Tworzenie własnego iteratora
Aby stworzyć własny iterator w Pythonie, musimy zdefiniować klasę, która implementuje metody __iter__()
i __next__()
. Poniżej znajduje się przykład klasy, która implementuje prosty iterator:
class CountDown:
# Inicjalizacja iteratora z określoną wartością startową
def __init__(self, start):
self.current = start
# Metoda __iter__() zwraca obiekt iteratora
def __iter__(self):
return self
# Metoda __next__() zwraca kolejny element
def __next__(self):
if self.current <= 0:
raise StopIteration # Zakończenie iteracji
else:
self.current -= 1
return self.current + 1
Przykład użycia własnego iteratora:
# Tworzenie instancji klasy CountDown
countdown = CountDown(3)
# Iteracja przez elementy
for number in countdown:
print(number) # Wyświetla 3, 2, 1
Podsumowanie
Iteratory w Pythonie są potężnym narzędziem do efektywnej pracy z kolekcjami danych. Dzięki metodzie iter()
i next()
, możemy łatwo przeglądać elementy kolekcji. Tworzenie własnych iteratorów poprzez implementację metod __iter__()
i __next__()
w klasach otwiera drogę do bardziej złożonych i kontrolowanych form iteracji, co jest szczególnie przydatne w obsłudze niestandardowych struktur danych.