Skip to content

Latest commit

 

History

History
84 lines (60 loc) · 3.77 KB

Iterator.md

File metadata and controls

84 lines (60 loc) · 3.77 KB

Паттерн Iterator / "Итератор"

Автор: Вахрушев Михаил


Итератор – это поведенческий паттерн. Его цель – позволить вам обходить элементы коллекции, не раскрывая ее базовое представление.

Назначение:

  • для доступа к содержимому агрегированных объектов без раскрытия их внутреннего представления;
  • для поддержки нескольких активных обходов одного и того же агрегированного объекта (желательно, но не обязательно);
  • для предоставления единообразного интерфейса с целью обхода различных агрегированных структур.

В итоге мы получаем разделение ответственности: клиенты получают возможность работать с разными коллекциями унифицированным образом, а коллекции становятся проще за счет того, что делегируют перебор своих элементам другой сущности.

Существуют два вида итераторов, внешний и внутренний.

Внешний итератор — это классический (pull-based) итератор, когда процессом обхода явно управляет клиент путем вызова метода Next

Внутренний итератор — это push-based-итератор, которому передается callback функция, и он сам уведомляет клиента о получении следующего элемента.

Классическая диаграмма паттерна “Итератор”, как она описана в небезызвестной книги «банды четырех»:

Чтобы реализовать итератор в Python, у нас есть два возможных варианта:

  1. Реализовать в классе специальные методы__iter__ и __next__.
  2. Использовать генераторы.

Примеры использования

  • Коллекция имеет сложную структуру. Необходимо скрыть ее от клиента из соображений удобства или безопасности;
  • Требуется сократить дублирование обходного кода по всему приложению;
  • Обход элементов различных структур данных;
  • Изначально неизвестны детали структуры данных.

Примеры кода

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