Book/파이썬 코딩의 기술
[BW 30] 리스트를 반환하기보다는 제너레이터를 사용하라
31514
2024. 10. 30. 10:52
리스트에 결과를 추가하고 반환하는 코드는 잡음이 많고, 모든 결과를 리스트에 다 저장해야 하므로 메모리를 많이 소진한다.
def index_words(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == ' ':
result.append(index + 1)
return result
address = '서울특별시 양천구 목동동로 12길 60'
result = index_words(address)
print(result)
>>>
[0, 6, 10, 15, 19]
제네레이터를 사용하면 함수 내부에서 리스트와 상호작용하는 코드가 사라지므로 가독성이 좋아진다.
그리고 작업 메모리에 모든 입력과 출력을 저장할 필요가 없으므로 출력이 큰 시퀀스를 만들 수 있다.
def index_words_iter(text):
if text:
yield 0
for index, letter in enumerate(text):
if letter == ' ':
yield index + 1
it = index_words_iter(address)
print(next(it))
print(list(index_words_iter(address)))
>>>
0
[0, 6, 10, 15, 19]
이 함수가 호출되면 제네레이터 함수가 실제로 실행되지 않고 즉시 이터레이터를 반환한다.
이터레이터가 next 내장 함수를 호출할 때마다 다음 yield까지 실행시킨다.
단, 제네레이터가 반환하는 이터레이터에 상태가 있기 때문에 호출하는 쪽에서 재사용이 불가능하다.