본문은 “파이썬 코딩의 기술 (Effective Python, 2판)”의 “Chapter 04. Comprehensions and Generators”을 읽고 정리한 내용입니다.
1
2
3
4
5
6
7
8
9
# -- 리스트를 반환하는 함수
def index_words(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == " ":
result.append(index + 1)
return result
1
2
3
4
5
6
7
# -- 이터레이터를 반환하는 함수 (제너레이터)
def index_words_it(text):
if text:
yield 0
for index, letter in enumerate(text):
if letter == " ":
yield index + 1
리스트를 반환하는 함수의 문제점
- 코드에 잡음이 많고 핵심을 알아보기 어렵다.
- 반환하기 전에 리스트에 모든 결과를 다 저장해야 하므로, 입력이 매우 크면 프로그램이 메모리를 소진할 수 있다.
이터레이터의 특징
next
내장 함수를 호출할 때마다 이터레이터는 제너레이터 함수를 다음yield
식까지 진행시킨다.- 쉽게 리스트로 변환할 수 있다. (ex.
list(it)
) 리스트에 모든 값을 저장할 필요가 없으므로 사용하는 메모리 크기를 어느정도 제한할 수 있게 된다.
작업 메모리에 모든 입력과 출력을 저장할 필요가 없으므로 입력이 아주 커도 출력 시퀀스를 만들 수 있다.
- 이터레이터에 상태가 있으므로, 호출하는 쪽에서 재사용이 불가능하다.