IT 엘도라도 로고
IT 엘도라도
황금

Python Iterator, Generator

2020-01-11 20:21

Python Iterator, Generator

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 함수 작성 예시

2-3. Generator Expression

List Expression과 달리, 실제 리스트 요소 데이터 전체를 반환하지 않는다. 대신, 그 표현식만을 갖는 generator 객체를 반환하게 된다. 따라서 메모리를 절약할 수 있다.
 
 
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.
말풍선
댓글 0
좋아요 0
    아직 작성된 댓글이 없어요.
사용자