[Python] iterator

Poke·2024년 4월 9일

iterator

Iterator vs Iterable

Iterable
반복가능한 객체. 내부요소(member)를 하나씩 리턴할 수 있는 객체를 Iterable하다라고함. for문을 순회할 수 있는객체를 iterable하다. 대표적으로 시퀀스타입과 컬렉션 타입.

Iterator
값을 차례대로 꺼낼 수 있는 객체. next() 함수 호출시 계속 그 다음 값을 반환하는 객체.
iterator은 iterable한 객체를 내장함수 또는 iterable 객체의 메소드로 생성할 수 있음.

# iterable한 리스트는 iterator일까
list = [1, 2, 3]
next(list)
TypeError: 'list' object is not an iterator

반복가능하다고 해서 iterator는 아니다. iter()함수를 이용하여 itertor 만들기.
iter()와 next()
iter()는 파이썬의 내장함수로, iterable객체를 받아 iterator를 반환함.
내부적으로 iter()함수는 객체의 __iter__() 메소드를 호출함

list = [1, 2, 3]
iter_list = iter(list)
print(type(iter_list))
<class 'list_iterator'>

리스트가 iterator가 되었으므로 next()함수를 호출하면

print(next(iter_list))
print(next(iter_list))
print(next(iter_list))
print(next(iter_list))
1
2
3
StopIteration                # 에러

__iter__와 __next__
__iter__()메소드는 클래스에서 iterator 프로토콜을 구현하는데 사용되는 특수매소드/매직메소드.
객체 자신이 iterator인 경우 자기자신을, 그렇지 않으면 iterator 객체를 반환함.
__iter__()는 직접 호출되기보다는 파이썬의 iter()함수나 for문 등으로 호출됨. 클래스를 정의할때 __iter__() 메소드를 구현함으로써 해당 클래스의 인스턴스가 iterable되도록함.

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.position = 0
        
    def __iter__(self):
        return self                      # iterator로 자기자신을 반환.
        
    def __next__(self):
        if self.position >= len(self.data):
            raise StopIteration
        result = self.data[self.position]
        self.position += 1
        return result
        
if __name__ == "__main__":
    item = MyIterator([1, 2, 3])
    for i in item:
        print(i)
1
2
3

for문과 Iterator
파이썬의 for문은 내부적으로 Iterator를 생성하여 동작함. __iter__메소드 이용.
stopiteration 예외가 발생하면 순회마침.

추가로 공부할것
iterator의 장점, 제너레이터, 이터레이터와 for문

0개의 댓글