반복형과 반복자

매일 공부(ML)·2023년 3월 23일
0

제어 흐름

반복형, 반복자, 제너레이터

반복형과 반복자

반복형

iter() 내장 함수가 반복자를 가져올 수 있는 모든 객체와 반복자를 반환하는 iter() 메서드를 구현하는 객체는 반복형으로 0에서 시작하는 인덱스를 받는 .getitem() 메서드를 구현하는 객체인 시퀀스

반복형과 반복자의 관계를 명확히 하는 것이 중요하고 파이썬은 반복형 객체에서 반복자를 가져온다.

s='ABC'
for char in s:
	print(char)
    
it = iter(s)
while True:
	try:
    	print(next(it))
    except StopIteration:
    	del it 
        break

StopIteration은 반복자가 모두 소진되었음을 알려주고, 이 예외는 for 루프 및 지능형 리스트, 튜플 언패킹 등 다른 반복 과정에서 내부적으로 처리된다.


next()

다음에 사용할 항목을 반환한느 것으로 더 이상 항목이 남아 있지 않으면 StopIteation을 발생시킨다.

iter()

self를 반환하고, for 루프 등 반복형이 필요한 곳에 반복자를 사용할 수 있게 해준다.

"""
Iterator ABC는 return self문장만으로 __iter__() 메서드를 구현하고 반복형이 필요한 곳애 반복자를 사용할 수 있다.
"""

class Iterator(Iterable):

	__slots__ = ()
    
    @abstractmethod
    def __next__(self):
    	"""반복자에서 다른 항목을 반환하고, 항목이 소진되면 StopIteration 예외를 발생시킨다."""
        raise StopIteration
        
    def __iter__(self):
    	return self
        
    @classmethod
    
    def __subclasshook__(cls,C):
    	if cls is Iterator:
        	if (any("__next__" in 8.__dict for B in C.__mro__) and any("__iter__") in B.__dict__ for B in C.__mro__)):
            return True
        return NotImplemented

반복자가 필수적으로 구현해야 하는 메서드는 next()와 iter() 밖에 없기에 next()를 호출하고 StopIteration 예외를 잡는 방법 외에는 항목이 소진되었느지 확인 방법이 없다.


반복자

다음 항목을 반환하거나, 다음 항목이 없을 때 StopIteeration 예외를 발생시키는, 인수를 받지 않는 next() 메서드를 구현하는 객체, 파이썬 반복자는 iter()메서드도 구현하므로 반복형이기도 하다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글