Autumn SALE
반복자

파이썬으로 작성된 반복자

반복자는 복잡한 데이터 구조의 내부 세부 정보를 노출하지 않고 해당 구조를 차례대로 순회할 수 있도록 하는 행동 디자인 패턴입니다.

반복자 덕분에 클라이언트들은 단일 반복기 인터페이스를 사용하여 유사한 방식으로 다른 컬렉션들의 요소들을 탐색할 수 있습니다.

복잡도:

인기도:

사용 예시들: 이 패턴은 파이썬 코드에 자주 사용됩니다. 많은 프레임워크들과 라이브러리들은 이 패턴을 컬렉션을 순회하는 표준 방법을 제공하기 위해 사용합니다.

식별법: 반복자는 그의 탐색 메서드들​(예: next, previous 등)​로 쉽게 인식할 수 있습니다. 또 반복자를 사용하는 클라이언트 코드는 반복자가 순회하는 컬렉션을 직접 접근하지 못할 수도 있습니다.

개념적인 예시

이 예시는 반복자 디자인 패턴의 구조를 보여주고 다음 질문에 중점을 둡니다:

  • 패턴은 어떤 클래스들로 구성되어 있나요?
  • 이 클래스들은 어떤 역할을 하나요?
  • 패턴의 요소들은 어떻게 서로 연관되어 있나요?

main.py: 개념적인 예시

from __future__ import annotations from collections.abc import Iterable, Iterator from typing import Any """ To create an iterator in Python, there are two abstract classes from the built- in `collections` module - Iterable,Iterator. We need to implement the `__iter__()` method in the iterated object (collection), and the `__next__ ()` method in theiterator. """ class AlphabeticalOrderIterator(Iterator): """ Concrete Iterators implement various traversal algorithms. These classes store the current traversal position at all times. """ """ `_position` attribute stores the current traversal position. An iterator may have a lot of other fields for storing iteration state, especially when it is supposed to work with a particular kind of collection. """ _position: int = None """ This attribute indicates the traversal direction. """ _reverse: bool = False def __init__(self, collection: WordsCollection, reverse: bool = False) -> None: self._collection = collection self._reverse = reverse self._sorted_items = None # Will be set on first __next__ call self._position = 0 def __next__(self) -> Any: """ Optimization: sorting happens only when the first items is actually requested. """ if self._sorted_items is None: self._sorted_items = sorted(self._collection._collection) if self._reverse: self._sorted_items = list(reversed(self._sorted_items)) """ The __next__() method must return the next item in the sequence. On reaching the end, and in subsequent calls, it must raise StopIteration. """ if self._position >= len(self._sorted_items): raise StopIteration() value = self._sorted_items[self._position] self._position += 1 return value class WordsCollection(Iterable): """ Concrete Collections provide one or several methods for retrieving fresh iterator instances, compatible with the collection class. """ def __init__(self, collection: list[Any] | None = None) -> None: self._collection = collection or [] def __getitem__(self, index: int) -> Any: return self._collection[index] def __iter__(self) -> AlphabeticalOrderIterator: """ The __iter__() method returns the iterator object itself, by default we return the iterator in ascending order. """ return AlphabeticalOrderIterator(self) def get_reverse_iterator(self) -> AlphabeticalOrderIterator: return AlphabeticalOrderIterator(self, True) def add_item(self, item: Any) -> None: self._collection.append(item) if __name__ == "__main__": # The client code may or may not know about the Concrete Iterator or # Collection classes, depending on the level of indirection you want to keep # in your program. collection = WordsCollection() collection.add_item("B") collection.add_item("A") collection.add_item("C") print("Straight traversal:") print("\n".join(collection)) print("") print("Reverse traversal:") print("\n".join(collection.get_reverse_iterator()), end="") 

Output.txt: 실행 결과

Straight traversal: A B C Reverse traversal: C B A 

다른 언어로 작성된 반복자

C#으로 작성된 반복자 C++로 작성된 반복자 Go로 작성된 반복자 자바로 작성된 반복자 PHP로 작성된 반복자 루비로 작성된 반복자 러스트로 작성된 반복자 스위프트로 작성된 반복자 타입스크립트로 작성된 반복자