Menu
Coddy logo textTech

Wyjątek StopIteration

Lekcja 3 z 13 w kursie Iteratory w Pythonie w Coddy.

Wyjątek StopIteration jest kluczowym elementem protokołu iteratorów w Pythonie. Sygnalizuje koniec sekwencji iteracji i odgrywa istotną rolę w kontrolowaniu działania iteratora. Przyjrzyjmy się temu wyjątkowi i jego znaczeniu.

Czym jest StopIteration?

StopIteration to wbudowany wyjątek w Pythonie, który jest zgłaszany, gdy iterator zostanie wyczerpany, czyli gdy nie ma już elementów do zwrócenia.

Kiedy zgłaszany jest StopIteration?

Python automatycznie zgłasza wyjątek StopIteration w dwóch głównych sytuacjach:

  1. Gdy funkcja next() zostanie wywołana dla iteratora, w którym nie ma już żadnych elementów.
  2. Gdy metoda __next__() niestandardowego iteratora została zaimplementowana tak, aby zgłaszać StopIteration na końcu iteracji.

Przykład StopIteration

Zobaczmy, jak działa StopIteration w przypadku prostego iteratora:

my_list = [1, 2, 3]
my_iterator = iter(my_list)

print(next(my_iterator))  # Wynik: 1
print(next(my_iterator))  # Wynik: 2
print(next(my_iterator))  # Wynik: 3
print(next(my_iterator))  # Wywołuje wyjątek StopIteration

W tym przykładzie, gdy przejdziemy już przez wszystkie elementy my_list, kolejne wywołanie next() zgłasza wyjątek StopIteration.

Znaczenie dla działania iteratora

Wyjątek StopIteration jest kluczowy z kilku powodów:

  1. Sygnalizowanie końca: Wyraźnie informuje, że iteracja dobiegła końca.
  2. Zakończenie pętli for: Pętle for w Pythonie korzystają z StopIteration, aby wiedzieć, kiedy się zakończyć.
  3. Kontrola niestandardowego iteratora: Podczas tworzenia niestandardowych iteratorów zgłoszenie StopIteration pozwala określić, kiedy iteracja powinna się zakończyć.

Obsługa StopIteration

Chociaż pętle for automatycznie obsługują StopIteration, przy bezpośrednim użyciu next() możesz chcieć jawnie obsłużyć ten wyjątek:

my_iterator = iter([1, 2, 3])

try:
    while True:
        item = next(my_iterator)
        print(item)
except StopIteration:
    print("Iteration finished")

Ten kod wypisze liczby 1, 2 i 3, a następnie „Iteration finished”, gdy zostanie przechwycony wyjątek StopIteration.

Zrozumienie wyjątku StopIteration jest niezbędne podczas pracy z iteratorami w Pythonie, ponieważ zapewnia mechanizm pozwalający kontrolować i kończyć iteracje w ustandaryzowany sposób.

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 własny iterator generujący ciąg liczb pierwszych do podanego limitu. Iterator powinien używać wyjątku StopIteration, aby zasygnalizować koniec ciągu, gdy osiągnie limit lub go przekroczy.

Otrzymujesz:

  • Liczbę całkowitą limit jako dane wejściowe

Twój iterator powinien:

  • Generować liczby pierwsze, zaczynając od 2
  • Zgłaszać wyjątek StopIteration, gdy następna liczba pierwsza przekroczyłaby podany limit

Zaimplementuj iterator jako klasę z metodami __iter__() i __next__(). Użyj metody __next__(), aby wygenerować następną liczbę pierwszą i obsłużyć wyjątek StopIteration.

Wypisz każdą wygenerowaną liczbę pierwszą w osobnym wierszu.

Dane wejściowe zostaną podane jako ciąg znaków reprezentujący liczbę całkowitą.

Spróbuj swoich sił

# Wczytaj dane wejściowe
limit = int(input())

class PrimeIterator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 2

    def __iter__(self):
        return self

    def __next__(self):
        # TODO: Zaimplementuj logikę generowania następnej liczby pierwszej
        # Jeśli następna liczba pierwsza przekracza limit, zgłoś StopIteration
        # Zwróć następną liczbę pierwszą, jeśli mieści się w limicie
        pass

# Utwórz instancję PrimeIterator
prime_iter = PrimeIterator(limit)

# Iteruj po liczbach pierwszych i wypisz każdą z nich
try:
    for prime in prime_iter:
        print(prime)
except StopIteration:
    pass  # Koniec iteracji

Wszystkie lekcje w sekcji Iteratory w Pythonie

Poćwicz samodzielnie: Kompilator Python online