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까지 실행시킨다.

 

단, 제네레이터가 반환하는 이터레이터에 상태가 있기 때문에 호출하는 쪽에서 재사용이 불가능하다.