AIFFEL Python Master 핵심정리 #05 이터레이터(Iterator)와 제너레이터(Generator)

이터레이터 (Iterator)

이터레이터(iterator)는 값을 차례대로 꺼낼 수 있는 객체(object)이다.

  • 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용
  • 이러한 데이터 생성을 뒤로 미루는 방식을 지연 평가(lazy evaluation)이라고함

반복 가능한 객체 (iterable)

  • 반복 가능한 객체는 문자열, 리스트, 튜플, range, 딕셔너리, 세트 등이 있다.
  • 반복 가능한 객체에서 __iter__ 메서드 또는 iter 함수를 호출하면 이터레이터가 나온다.
  • 이터레이터에서 __next__ 메서드 또는 next 함수를 호출하면 반복 가능한 객체의 요소를 차례대로 꺼낼 수 있다.
이터레이터 = 반복가능한객체.__iter__()    # 반복가능한 객체에서 이터레이터를 얻음
이터레이터.__next__()                     # 반복 가능한 객체의 요소를 차례대로  꺼냄
 
이터레이터 = iter(반복가능한객체)         # iter 함수 사용
next(이터레이터)                          # next 함수 사용

이터레이터 생성

클래스에서 __iter__, __next__ 메서드를 구현하면 이터레이터가 된다.

class 이터레이터이름:
    def __iter__(self):
        return self
 
    def __next__(self):
        값 생성 코드, 반복을 끝내려면 StopIteration 예외를 발생시킴
 
이터레이터객체 = 이터레이터()    # 이터레이터 객체 생성
이터레이터.__next__()            # 이터레이터에서 값을 차례대로 꺼냄
next(이터레이터)                 # next 함수 사용
 
for i in 이터레이터():    # 이터레이터를 반복문에 사용
    pass

클래스에 __getitem__ 메서드를 구현하면 인덱스로 접근할 수 있는 이터레이터가 된다. 이때, __iter____next__ 메서드는 생략 가능

class 이터레이터이름:
    def __getitem__(self, index):
        인덱스에 해당하는 값을 반환하는 코드, 지정된 범위를 벗어났다면 IndexError 예외를 발생시킴
 
이터레이터객체 = 이터레이터()    # 이터레이터 객체 생성
이터레이터객체[인덱스]           # 인덱스로 접근

이터레이터 언패킹

이터레이터는 변수 여러 개에 값을 저장하는 언패킹이 가능하다.

변수1, 변수2, 변수3 = 이터레이터()

제너레이터 (Generator)

제너레이터는 이터레이터를 생성해주는 함수이며, 함수 안에서 yield 를 사용하여 간단하게 이터레이터를 만들 수 있다.

def 제너레이터이름():     # 제너레이터 함수를 만듦
    yield# yield로 값을 발생시킴
 
제너레이터객체 = 제너레이터()    # 제너레이터 객체 생성
제너레이터객체.__next__()        # __next__ 메서드를 호출하면 yield에 지정한 값이 반환값으로 나옴
next(제너레이터)                 # next 함수 사용
 
for i in 제너레이터():           # 제너레이터를 반복문에 사용
    pass
  • yield 는 값을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
  • yield from 을 사용하면 값을 여러 번 바깥으로 전달
yield from 반복가능한객체
yield from 이터레이터
yield from 제너레이터객체

제너레이터 표현식

리스트 표현식을 [ ](대괄호) 대신 ( )(괄호)로 묶으면 제너레이터 표현식이 된다.

(for 변수 in 반복가능한객체)
(i for i in range(100))

좋은 웹페이지 즐겨찾기