Iteratory w Pythonie

Iteratory w Pythonie

Ten artykuł wyjaśnia iteratory w Pythonie.

YouTube Video

Iteratory w Pythonie

Przegląd

W Pythonie iterator to podstawowy mechanizm do przetwarzania elementów kolekcji, takich jak listy, krotki czy słowniki, jeden po drugim.

Czym jest iterator?

Iterator to obiekt, który potrafi zwracać elementy jeden po drugim. W Pythonie obiekt jest uważany za iterator, jeśli spełnia dwa poniższe warunki:.

  • Ma metodę __iter__(), która zwraca sam siebie.
  • Ma metodę __next__(), która zwraca kolejny element. Zgłasza wyjątek StopIteration, gdy nie ma już więcej elementów.
1iterator = iter([1, 2, 3])
2print(next(iterator))  # 1
3print(next(iterator))  # 2
4print(next(iterator))  # 3
5# print(next(iterator))  # StopIteration occurs
  • W tym kodzie funkcja iter() jest używana do przekształcenia listy w iterator, a funkcja next() służy do pobierania i wyświetlania kolejnych elementów jeden po drugim.

Różnica względem obiektu iterowalnego (Iterable)

Obiekt iterowalny (Iterable) to obiekt, który implementuje metodę __iter__() i może być używany w pętli for. Listy i krotki to przykłady obiektów iterowalnych.

1nums = [10, 20, 30]
2it = iter(nums)  # Get an iterator from the iterable
3print(next(it))  # 10
  • Ten kod jest przykładem uzyskania iteratora z obiektu iterowalnego, takiego jak lista, oraz pobierania elementów po kolei za pomocą next().

Jak sprawdzić:

1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable))  # True
7print(isinstance(nums, Iterator))  # False
8print(isinstance(it, Iterator))    # True
  • Ten kod potwierdza, że nums jest obiektem iterowalnym, ale nie jest iteratorem, podczas gdy it, uzyskany za pomocą iter(nums), jest iteratorem.

Związek między pętlą for a iteratorem

Pętla for w Pythonie wewnętrznie działa w następujący sposób:.

1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4    try:
5        value = next(iterator)
6        print(value)
7    except StopIteration:
8        break
  • Jak widać, pętla for niejawnie używa iteratora do realizacji iteracji.

Tworzenie własnego iteratora

Możesz utworzyć własny iterator za pomocą klasy.

 1class Countdown:
 2    def __init__(self, start):
 3        self.current = start
 4
 5    def __iter__(self):
 6        return self
 7
 8    def __next__(self):
 9        if self.current <= 0:
10            raise StopIteration
11        value = self.current
12        self.current -= 1
13        return value
14
15for num in Countdown(3):
16    print(num)  # 3, 2, 1
  • Ten kod definiuje własny iterator odliczający w dół przy użyciu klasy Countdown i wypisuje liczby od 3 do 1 za pomocą pętli for.

Różnica między iteratorami i generatorami oraz kiedy ich używać

Generatory oferują funkcjonalność podobną do iteratorów. Umożliwiają zwięzłe definiowanie iteratorów.

1def countdown(n):
2    while n > 0:
3        yield n
4        n -= 1
5
6for i in countdown(3):
7    print(i)  # 3, 2, 1
  • Ten kod definiuje funkcję generatora, która odlicza w dół za pomocą yield i wypisuje liczby od 3 do 1 używając pętli for.

Różnice między iteratorami (klasa) a generatorami (funkcja)

Istnieją następujące różnice pomiędzy iteratorami (klasy) a generatorami (funkcje):.

Cecha Iterator (klasa) Generator (funkcja)
Definicja __iter__() + __next__() Funkcja używająca yield
Zarządzanie stanem Ręczne zarządzanie atrybutami wymagane Stan przechowywany automatycznie
Czytelność Może się skomplikować Proste i czytelne
  • Różnica w sposobie definiowania Iterator definiujemy ręcznie, implementując dwie metody: __iter__() oraz __next__(). Natomiast generator to funkcja używająca słowa kluczowego yield, dzięki czemu kod jest znacznie prostszy.

  • Różnica w zarządzaniu stanem W przypadku iteratora musisz ręcznie zarządzać bieżącym stanem oraz postępem za pomocą zmiennych. Generatory natomiast automatycznie przechowują swój stan wewnętrznie, eliminując potrzebę ręcznego zarządzania.

  • Czytelność kodu Iteratory mogą się skomplikować, ponieważ wymagają wielu metod oraz ręcznego zarządzania stanem. Natomiast generatory mają prostą składnię, przez co są łatwiejsze do zrozumienia nawet dla początkujących.

Biblioteka standardowa do pracy z iteratorami: itertools

itertools, biblioteka standardowa Pythona, zapewnia potężne narzędzia do pracy z iteratorami.

1import itertools
2
3for x in itertools.count(10, 2):  # 10, 12, 14, ...
4    if x > 20:
5        break
6    print(x)
  • Zawiera również wiele innych funkcji, takich jak cycle, repeat, chain, islice oraz tee.

Przykłady zastosowań iteratorów

Przykładowe zastosowania iteratorów obejmują następujące przypadki:.

  • Przetwarzanie linii z pliku: Odczytywanie linii z pliku po jednej jako iterator.
  • Wydajne wykorzystanie pamięci: Przetwarzanie dużych ilości danych w kolejności.
  • Reprezentacja nieskończonych sekwencji: Używanie funkcji takich jak itertools.count().

Podsumowanie

  • Iterator to obiekt, który może pobierać kolejne wartości w sposób sekwencyjny.
  • Możesz stworzyć własny iterator, definiując metody __iter__() oraz __next__().
  • Są one obsługiwane automatycznie przez pętle for lub funkcję next().
  • Używanie generatorów lub itertools umożliwia bardziej wydajne przetwarzanie.

Dzięki iteratorom możesz przetwarzać duże ilości danych sekwencyjnie i efektywnie pod względem pamięciowym, co pozwala na kontrolowane zarządzanie stanem i zwiększa wydajność programu.

Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.

YouTube Video