Programming Language/Python

[Python] 이터레이터(Iterator)

LeeJaeJun 2024. 6. 14. 11:15
728x90
반응형

이터레이터(Iterator)

  • 반복 가능한 객체를 순회할 수 있는 객체
    • 반복 가능한 객체란? -> List, tuple, set 등
    • 반복 가능한 객체 != 이터레이터 
    • 반복 가능한 객체 == 이터러블(iterable) 객체 (반복가능하면 이터레이터로 만들 수 있는 것)
    • 이터러블 객체는 __iter__() method를 가지고 있고, 이 method는 이터레이터를 반환하는 역할
    • 이터러블 객체는 iter() 함수를 이용하여 이터레이터로 만들 수 있
mylist = [1, 2, 3]
next(mylist)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not an iterator
# Iterable하다는 것이 Iterator라는 것은 아니다!
  • 이터러블 객체에서 값을 하나씩 꺼내는 역할을 하는 객체
  • 이터레이터는 __next__() method를 가지고 있고, 이 method는 다음 값을 반환하는 역할. 더 이상 반환할 값이 없으면 StopIteration exception을 발생
  • 이터러블 객체는 __iter__() method를 통해 자기 자신을 반환
my_list = [1, 2, 3]  # 이터러블 객체

# 이터러블 객체에서 이터레이터를 얻음
my_iterator = iter(my_list)

print(next(my_iterator))  # 출력: 1
print(next(my_iterator))  # 출력: 2
print(next(my_iterator))  # 출력: 3
print(next(my_iterator))  # StopIteration 예외 발생
  • 이터레이터의 값을 가져올 때, 일반적으로는 for문 사용
    • next() 함수를 따로 호출할 필요없음
    • StopIteration 예외도 신경쓸 필요없음
my_list = [1, 2, 3]

my_iterator = iter(my_list)

for i in my_iterator:
	print(i)
   
# 1
# 2
# 3
  • 직접 이터레이터 구현하기
class MyIterator:
    def __init__(self, data):
        # 생성자: 데이터와 현재 위치를 초기화합니다.
        self.data = data
        self.position = 0

    def __iter__(self):
        # 이터레이터 객체 자체를 반환합니다.
        return self

    def __next__(self):
        # 데이터의 끝에 도달하면 StopIteration 예외를 발생시킵니다.
        if self.position >= len(self.data):
            raise StopIteration
        # 현재 위치의 데이터를 반환하고 위치를 1 증가시킵니다.
        result = self.data[self.position]
        self.position += 1
        return result


if __name__ == "__main__":
    # MyIterator 클래스의 인스턴스를 생성합니다.
    i = MyIterator([1, 2, 3])
    # for 루프를 사용하여 이터레이터를 순회합니다.
    for item in i:
        print(item)
728x90
반응형