Автор: Вахрушев Михаил
Итератор – это поведенческий паттерн. Его цель – позволить вам обходить элементы коллекции, не раскрывая ее базовое представление.
Назначение:
- для доступа к содержимому агрегированных объектов без раскрытия их внутреннего представления;
- для поддержки нескольких активных обходов одного и того же агрегированного объекта (желательно, но не обязательно);
- для предоставления единообразного интерфейса с целью обхода различных агрегированных структур.
В итоге мы получаем разделение ответственности: клиенты получают возможность работать с разными коллекциями унифицированным образом, а коллекции становятся проще за счет того, что делегируют перебор своих элементам другой сущности.
Существуют два вида итераторов, внешний и внутренний.
Внешний итератор — это классический (pull-based) итератор, когда процессом обхода явно управляет клиент путем вызова метода Next
Внутренний итератор — это push-based-итератор, которому передается callback функция, и он сам уведомляет клиента о получении следующего элемента.
Классическая диаграмма паттерна “Итератор”, как она описана в небезызвестной книги «банды четырех»:
Чтобы реализовать итератор в Python, у нас есть два возможных варианта:
- Реализовать в классе специальные методы__iter__ и __next__.
- Использовать генераторы.
Примеры использования
- Коллекция имеет сложную структуру. Необходимо скрыть ее от клиента из соображений удобства или безопасности;
- Требуется сократить дублирование обходного кода по всему приложению;
- Обход элементов различных структур данных;
- Изначально неизвестны детали структуры данных.
Input
Colors = ["red", "black", "green"]
ColorsIter = iter(Colors)
try:
print(next(ColorsIter))
print(next(ColorsIter))
print(next(ColorsIter))
except StopIterations:
print("другие элементы отсутствуют")
Output
red
black
green
** Process exited - Return Code: 0 **
Press Enter to exit terminal
Input
Colors = ["red", "black", "green"]
ColorsIter = iter(Colors)
While True:
try:
print(next(ColorsIter))
except StopIteration:
break
Output
red
black
green
** Process exited - Return Code: 0 **
Press Enter to exit terminal