안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

파이썬 (Python)

[Python] Iterator, Generator

피그브라더 2020. 1. 11. 20:21

1. Iterator

1-1. Iterable 객체

파이썬에서 iterable 객체란 '반복 가능한 객체'를 의미한다. 대표적인 예로, for 문에서 사용하는 리스트, 튜플, 문자열 등이 바로 iterable 객체이다.

 

1-2. Iterable 객체이기 위한 조건

어떤 객체의 타입(클래스)이 A라고 해보자. 그러면 다음과 같은 조건을 만족할 때 A 타입의 객체가 곧 iterable 객체가 된다.

 

① 클래스 A는 __iter__() 메소드를 구현해야 한다. 반드시 iterator 객체를 반환하도록 구현해야 한다.

    (→ 해당 iterator 객체는 동일한 클래스(A)의 객체여도 되고 별도로 작성된 다른 클래스의 객체여도 된다.)

② iterator 객체의 클래스(A 혹은 다른 클래스)는 반드시 __next__() 메소드를 구현해야 한다(python 2라면 next() 메소드).

 

1-3. Iterator 관련 파이썬 내장 함수 (built-in function)

내장 함수 설명
iter(iterable 객체) 해당 iterable 객체의 iterator 객체를 반환한다. (__iter__() 메소드 호출)
next(iterator 객체) 해당 iterator 객체의 다음 요소를 반환한다. (__next__() 메소드 호출)

 

1-4. 참고 : for 문의 동작 원리

① 먼저 해당 iterable 객체의 __iter__() 메소드를 호출하여 itetator 객체를 얻어낸다. 
② 이후, next() 내장 함수를 이용하여 반복을 수행한다(내부적으로 __next__() 메소드 호출). 

 

2. Generator

2-1. Generator 함수

파이썬에서 generator 함수란 generator라고 불리는 특별한 종류의 iterator를 반환하는 함수를 말하며, yield 키워드를 사용하여 정의할 수 있다. 몸체 코드는 해당 generator를 대상으로 파이썬 내장 함수 next()를 호출할 때마다 실행되며, 예외가 발생하면 종료하게 된다. 몸체 코드 실행 도중 yield 키워드를 만나면 현재의 상태(지역 변수, PC 값 등등)를 기록하고 실행을 중지한 뒤, 반환 값을 next() 함수 호출부로 전달하게 된다. 이후 다시 next() 함수를 호출하면 마치 외부 함수를 호출하고 돌아갈 때처럼 기억해둔 그 상태로 돌아가서 실행을 재개하게 된다. 따라서 일반적인 iterator에 비해서 메모리를 월등히 절약할 수 있고, 계산 결괏값이 필요할 때까지 계산을 지연시키는 효과를 발휘할 수 있다.

 

2-2. Generator 함수 작성 예시

# Generator 함수
def generator_func():
     yield 1
     yield 2
     yield 3

# Generator 객체
g = generator_func()
print(type(g))  # <class 'generator'>

# next() 함수 사용
n = next(g); print(n)  # 1
n = next(g); print(n)  # 2
n = next(g); print(n)  # 3

 

2-3. Generator Expression

List Expression과 달리, 실제 리스트 요소 데이터 전체를 반환하지 않는다. 대신, 그 표현식만을 갖는 generator 객체를 반환하게 된다. 따라서 메모리를 절약할 수 있다.

(i for i in range(10) if i % 2)

 

 

 

 

 

 

본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.

http://pythonstudy.xyz/python/article/23-Iterator%EC%99%80-Generator