Implementowanie __next__()
Lekcja 5 z 13 w kursie Iteratory w Pythonie w Coddy.
Metoda __next__() jest kluczowym elementem tworzenia własnych iteratorów w Pythonie. Określa, jak pobrać następny element w sekwencji iteracji. Implementując __next__(), kontrolujesz działanie swojego iteratora, określając, jakie wartości generuje i kiedy powinien się zatrzymać.
Cel metody __next__()
Metoda __next__() spełnia dwa główne zadania:
- Zwracanie następnego elementu w sekwencji
- Zgłaszanie wyjątku
StopIteration, gdy nie ma już więcej elementów
Implementacja __next__()
Oto podstawowa struktura implementacji __next__():
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
result = self.data[self.index]
self.index += 1
return result
Kluczowe aspekty metody __next__()
- Zarządzanie stanem: Śledź bieżący stan iteracji (np. za pomocą indeksu).
- Zwracanie następnego elementu: Określ i zwróć następny element w sekwencji.
- StopIteration: Zgłoś wyjątek
StopIteration, gdy nie ma już więcej elementów. - Efekty uboczne: Zaktualizuj niezbędny stan wewnętrzny przed następną iteracją.
Przykład: własny iterator zakresu
Oto przykład własnego iteratora, który naśladuje uproszczoną wersję funkcji range()</function> w Pythonie:</p>
<pre><code class="language-python">class CustomRange:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current >= self.end:
raise StopIteration
result = self.current
self.current += 1
return result
# Użycie niestandardowego iteratora zakresu
for num in CustomRange(1, 5):
print(num) # Wyświetla: 1, 2, 3, 4
W tym przykładzie __next__() zwraca bieżącą liczbę i zwiększa ją na potrzeby następnej iteracji, zgłaszając wyjątek StopIteration, gdy osiągnie wartość końcową.
Implementując __next__(), definiujesz podstawowe działanie swojego iteratora, dzięki czemu może on bezproblemowo współpracować z mechanizmami iteracji w Pythonie, takimi jak pętle for i funkcja next().
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 własną klasę iteratora o nazwie FibonacciIterator, która generuje liczby Fibonacciego aż do określonego limitu. Ciąg Fibonacciego zaczyna się od 0 i 1, a każda kolejna liczba jest sumą dwóch poprzednich.
Otrzymujesz:
- Liczbę całkowitą
limitjako dane wejściowe
Twoja klasa FibonacciIterator powinna:
- Implementować metodę
__next__(), aby generować kolejną liczbę Fibonacciego - Zatrzymać iterację, gdy następna liczba Fibonacciego przekroczyłaby podany limit
- Zgłaszać wyjątek
StopIteration, gdy ciąg się wyczerpie
Po zaimplementowaniu klasy FibonacciIterator utwórz jej instancję, używając limitu z danych wejściowych, i wypisz każdą wygenerowaną liczbę Fibonacciego w nowej linii.
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 FibonacciIterator:
def __init__(self, limit):
self.limit = limit
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
# TODO: Zaimplementuj metodę __next__()
# Wygeneruj następną liczbę Fibonacciego
# Rzuć wyjątek StopIteration, gdy ciąg się wyczerpie
pass
# Utwórz instancję klasy FibonacciIterator
fib_iterator = FibonacciIterator(limit)
# TODO: Przejdź przez ciąg Fibonacciego i wypisz każdą liczbę
# Note: Pamiętaj, aby wypisać każdą liczbę Fibonacciego, żeby przejść testyWszystkie lekcje w sekcji Iteratory w Pythonie
2Tworzenie własnych iteratorów
Implementowanie __iter__()Implementowanie __next__()Iteratory nieskończonePoćwicz samodzielnie: Kompilator Python online