Skip to content

Latest commit

 

History

History
57 lines (44 loc) · 1.53 KB

BetterWay30.md

File metadata and controls

57 lines (44 loc) · 1.53 KB

30. 리스트를 반환하기보다는 제너레이터를 사용하라

1. 리스트 반환 코드 문제점

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 = '컴퓨터(영어: Computer, 문화어: 콤퓨터 , 순화어: 전산기)는 진공관'
result = index_words(address)
print(result[:10])

>>>
[0, 8, 18, 23, 28, 38]
  • index_words 함수 문제점
    • 코드 가독성 떨어짐, 핵심 파악 어려움
      • 리스트에 append 되는 값이 무엇을 뜻하는지 파악하기 어려움
    • 반환하기 전 리스트에 모든 결과를 다 저장함
      • 리스트에 저장될 데이터가 너무 커서 메모리 초과될 수 있음

2. 제너레이터

  • yield 를 사용하는 함수에 의해 만들어짐
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(next(it))

>>>
0
8
  • 함수 실행이 아닌 iterator 반환
  • 이터레이터를 가지고 next 내장 함수를 호출할 때 실제 함수가 yield까지 실행됨
  • 이전 yield 를 재사용 할 수 없는 단점 존재

3. 제너레이터 장점

  • 반환하는 리스트와의 상호작용하는 코드가 사라졌으므로 가독성 높아짐
  • 실제 사용하는 메모리 크기 제한 가능