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
'파이썬 (Python)' 카테고리의 다른 글
[Python] GIL (Global Interpreter Lock) 이해하기 (9) | 2021.07.03 |
---|---|
[Python] 비동기 프로그래밍 동작 원리 (asyncio) (47) | 2021.07.02 |
[Python] 정규 표현식(정규식) 사용하기 (2) | 2021.03.04 |
[Python] bytes, bytearray, 인코딩 및 디코딩 (0) | 2020.07.09 |
[Python] 객체와 기본 자료형 (0) | 2020.01.11 |