2.2.5 Iterator Types

Dodano w wersji 2.2.  

Python obsługuje mechanizm iteracji w ramach elementów typów pojemnikowych. Mechanizm ten jest zaimplementowany z wykorzystaniem dwóch metod. Dzięki temu klasy zdefiniowane przez użytkownika mogą obsługiwać iteracje. Sekwencje, opisane w dalszej części podręcznika, automatycznie udostępniają metody iteracyjne.

W celu implementacji mechanizmu iteracji w pojemniku, należy zdefiniować w jego klasie metodę __iter__:

__iter__()
Zwraca obiekt iteratora. Obiekt ten jest wymagany przez opisany poniżej mechanizm iteracji. Jeśli obiekt może udostępniać kilka typów iteracji, możemy zastosować dodatkowe metody, które będą miały za zadanie określić typ porządanej iteracji. Przykładem pojemnika obsługującego różne typy iteracji może być drzewo, które można przeglądać najpierw wszerz, lub najpierw w głąb. Metoda ta ma związek z elementem tp_iter w strukturze typów API Pythona dla języka C.

Obiekty iteratorów muszą natomiast implementować następujące dwie metody, stanowiące tak zwany protokół iteracyjny:

__iter__()
Zwraca sam obiekt iteratora. Metoda ta pozwala na wykorzystanie jako argumentów instrukcji for oraz in zarówno kontenerów jak i samych iteratorów. Metoda ta ma związek z elementem tp_iter w strukturze typów API Pythona dla języka C.

next()
Zwraca następny element w kontenerze. Jeśli w kontenerze nie już więcej elementów, wywołany zostanie wyjątek StopIteration. Metoda ta ma związek z elementem tp_iternext w strukturze typów API Pythona dla języka C.

Python definiuje kilka obiektów iteratorów obsługujących iterację w obiektach typów ogólnych oraz sekwencyjnych, słownikach i innych, bardziej specjalizowanych formach. Konkretne typy nie w tym momencie są istotne poza ich implementacją protokołu iteracyjnego.

Jednym z założeń protokołu iteracyjnego jest konsekwentne wywoływanie wyjątku StopIteration w przypadku, gdy wyjątek ten był już raz wywołany dla danego iteratora w wyniku wywołania metody next(). Implementacje nie przestrzegające tej zasady są uznawane za błędne. Wymóg ten został dodany w wersji 2.3 języka Python. W jej myśl wiele implementacji iteratorów w Pythonie 2.2 jest błędnych.

Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.