이터레이터

<aside> 💡 이터러블 안에 든 아이템을 하나씩 돌며(순회) 반환하는 객체입니다. 다음 아이템을 반환하는 __next__ 매직 메소드를 갖습니다.

</aside>

iterable_list = [1, 2, 3]
iterable_tuple = (4, 5, 6)
iterable_string = "abc"

# 이터레이터(iterator)를 만드는 방법
iterator_list = iter(iterable_list)
iterator_tuple = iter(iterable_tuple)
iterator_string = iter(iterable_string)

lst_val_0 = next(iterator_list)
tpl_val_0 = next(iterator_tuple)
str_val_0 = next(iterator_string)

lst_val_1 = next(iterator_list)
tpl_val_1 = next(iterator_tuple)
str_val_1 = next(iterator_string)

pass
my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)  # 리스트에서 이터레이터 생성

# 반복문과 next() 함수로 이터레이터의 모든 요소 순회
while True:
    try:
        element = next(my_iter)
        print(element)
    except StopIteration:
        # 모든 요소를 순회하면 StopIteration 예외 발생
        break

이터레이터를 리스트로

# 리스트로 바꾸기 1 (리스트 생성자)
my_iter = iter(my_list) # 💡 이터레이터는 1회용이므로 재정의 (빼고 해 볼 것)
list_from_iter_1 = list(my_iter)

# 리스트로 바꾸기 2 (컴프리헨션)
my_iter = iter(my_list)
list_from_iter_2 = [num for num in my_iter]

이터레이터 직접 만들기

<aside> 💡 이터레이터는 다음 차례 값을 반환하는 __next__() 메소드를 가지며, iter() 호출시 스스로를 반환합니다.

</aside>

class CounterIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current > self.end:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1