Iterable

  • 반복가능한 객체를 iterable 객체라고 함
  • 대표적으로 리스트, 튜플, 세트, str 등을 iterable 객체라고 함

Iterator

  • 값을 차례대로 꺼낼 수 있는 객체를 iterator 객체 라고함
  • Iterable 하다고 해서 모두 Iterator는 아님
  • 그 값을 한번 읽으면 그 값을 다시 읽을 수 없음

  • iterator는 iterable한 객체를 iter()또는 __iter__()메서드로 생성
a = [1, 2, 3]

ai = iter(a)
print(type(ai))

ai = a.__iter__()
print(type(ai))
<class 'list_iterator'>
<class 'list_iterator'>
  • 값을 꺼낼 때는 next()를 사용하여 꺼내꺼나 __next__()를 사용하여 꺼냄
  • 더 반환할 값이 없으면 StopIteration 예외가 발생
print(next(ai)) # ai.__next__()
print(next(ai)) # ai.__next__()
print(next(ai)) # ai.__next__()
# print(next(ai))
1
2
3
  • for문을 사용하여 값을 가져올 수 있음
  • for문이 자동으로 next()를 호출하고 예외도 알아서 처리
  • for는 iterable한 객체를 iterator로 만들어서 하나씩 값을 꺼내는 역할을 수행함
a = [1, 2, 3]
ia = iter(a)
for i in ia:
    print(i)
1
2
3

이터레이터 만들기

  • 클래스를 이용해서 세부적인 이터레이터를 만들 수 있음
class MyFunc:
    def __init__(self, start, stop):
        self.start = start
        self.stop = stop
        
    def __iter__(self): 
        return self # iterable한 객체가 없으므로 현재 인스턴스를 반환
    
    def __next__(self):
        if self.start <= self.stop:
            result = self.start
            self.start += 1
            return result
        else:
            raise StopIteration
a = MyFunc(1, 10)
for i in a:
    print(i)
1
2
3
4
5
6
7
8
9
10

이터레이터 언패킹

  • 이터레이터의 결과를 변수 여러 개에 할당이 가능
  • 이터레이터가 반복하는 횟수와 변수의 개수는 같아야함
a, b, c = MyFunc(1, 3)
print(a)
print(b)
print(c)
1
2
3

참고자료

카테고리:

업데이트:

댓글남기기