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ątekStopIteration
, 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 funkcjanext()
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 gdyit
, 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ętlifor
.
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ętlifor
.
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 kluczowegoyield
, 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
oraztee
.
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.