Iteratory nieskończone
Lekcja 6 z 13 w kursie Iteratory w Pythonie w Coddy.
Nieskończone iteratory to szczególny rodzaj iteratorów w Pythonie, które mogą generować nieskończony ciąg wartości. W przeciwieństwie do iteratorów skończonych, które w końcu zgłaszają wyjątek StopIteration, iteratory nieskończone bez końca generują kolejne wartości.
Charakterystyka nieskończonych iteratorów
- Nigdy nie zgłaszają wyjątku
StopIteration. - Mogą być przydatne do generowania ciągłych sekwencji lub symulowania niekończących się strumieni danych.
- Podczas ich używania należy uważać, aby uniknąć nieskończonych pętli.
Tworzenie nieskończonego iteratora
Oto prosty przykład nieskończonego iteratora, który generuje niekończący się ciąg liczb całkowitych:
class InfiniteCounter:
def __init__(self, start=0):
self.count = start
def __iter__(self):
return self
def __next__(self):
current = self.count
self.count += 1
return current
# Użycie
counter = InfiniteCounter()
for i in counter:
print(i)
if i >= 5:
break # Zapobiega nieskończonej pętli
W tym przykładzie klasa InfiniteCounter będzie bez końca generować liczby. Używamy instrukcji break, aby zatrzymać iterację po spełnieniu określonego warunku.
Wbudowane nieskończone iteratory
Moduł itertools języka Python udostępnia kilka przydatnych nieskończonych iteratorów:
itertools.count(start, step): Zlicza w nieskończoność, zaczynając od podanej wartości początkowejitertools.cycle(iterable): Bez końca cyklicznie przechodzi przez obiekt iterowalnyitertools.repeat(elem, [n]): Powtarza element bez końca lub n razy
Przykład użycia itertools.count():
from itertools import count
for i in count(10):
print(i)
if i >= 15:
break
# Wypisuje: 10, 11, 12, 13, 14, 15
Ostrzeżenia i dobre praktyki
- Zawsze zapewnij sobie możliwość przerwania pętli korzystających z nieskończonych iteratorów, aby zapobiec zawieszeniu programu.
- Używaj nieskończonych iteratorów rozważnie i tylko wtedy, gdy jest to konieczne.
- Rozważ użycie funkcji generatorów, aby tworzyć nieskończone sekwencje w sposób bardziej oszczędny pod względem pamięci.
Nieskończone iteratory są potężnym narzędziem w sytuacjach wymagających ciągłego generowania lub przetwarzania danych, ale należy używać ich ostrożnie, aby mieć pewność, że program działa zgodnie z oczekiwaniami.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wyzwanie
ŁatwyUtwórz klasę nieskończonego iteratora o nazwie CyclicCounter, która będzie bez końca cyklicznie przechodzić przez podany zakres liczb. Iterator powinien rozpoczynać od określonej liczby i wracać do niej po osiągnięciu końca zakresu.
Otrzymujesz:
- Dwie liczby całkowite na wejściu:
startiend(włącznie)
Twoja klasa CyclicCounter powinna:
- Implementować metody
__iter__()i__next__() - Generować liczby od
startdoend(włącznie) - Po osiągnięciu
endwracać dostarti kontynuować bez końca
Po zaimplementowaniu klasy CyclicCounter utwórz jej instancję, używając wartości wejściowych. Następnie użyj pętli, aby wypisać pierwsze 10 liczb wygenerowanych przez iterator, każdą w nowej linii.
Dane wejściowe zostaną podane jako dwie liczby całkowite oddzielone spacją, reprezentujące start i end.
Spróbuj swoich sił
# Odczytaj dane wejściowe
start, end = map(int, input().split())
class CyclicCounter:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start
def __iter__(self):
return self
# TODO: Zaimplementuj metodę __next__()
# Utwórz instancję CyclicCounter
counter = CyclicCounter(start, end)
# TODO: Użyj pętli, aby wypisać pierwsze 10 liczb wygenerowanych przez iterator
# Pamiętaj, aby wypisać każdą liczbę w osobnym wierszuWszystkie lekcje w sekcji Iteratory w Pythonie
2Tworzenie własnych iteratorów
Implementowanie __iter__()Implementowanie __next__()Iteratory nieskończonePoćwicz samodzielnie: Kompilator Python online