이터레이터(iterator)는 값을 차례대로 꺼낼 수 있는 객체(object)이다.
__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 = 이터레이터()
제너레이터는 이터레이터를 생성해주는 함수이며, 함수 안에서 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))