Menu
Coddy logo textTech

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ątkowej
  • itertools.cycle(iterable): Bez końca cyklicznie przechodzi przez obiekt iterowalny
  • itertools.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.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

challenge icon

Wyzwanie

Łatwy

Utwó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: start i end (włącznie)

Twoja klasa CyclicCounter powinna:

  • Implementować metody __iter__() i __next__()
  • Generować liczby od start do end (włącznie)
  • Po osiągnięciu end wracać do start i 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 wierszu

Wszystkie lekcje w sekcji Iteratory w Pythonie

Poćwicz samodzielnie: Kompilator Python online