제너레이터 활용

매일 공부(ML)·2022년 6월 21일
0

이어드림

목록 보기
81/146

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

시퀀스를 결과로 만들어내는 함수를 만들기

#가장 간단한 방법

"""
코드의 잡음이 많아서 가독성을 해친다(핵심을 알아보기 어려움)
잦은 메서드 호출로 리스틑에 추가될 값의 중요성 희석
"""
der 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]

#개선 방법: 제너레이터를 사용
#yield 식을 사용하는 함수

"""
제너레이터 함수가 실제로 실행되지 않고 즉시 이터레이터를 반환
next 내장 함수를 호출할 때마다 yield식까지 진행
제너레이터는 yield에 전달하는 값은 이터레이터에 의해 호출하는 쪽에 반환

it = index_words_iter(address)
print(next(it)) # 0
print(next(it)) # 8

#결과
result = list(index_words_iter(address))
print(result[:10]) # [0,8,18,23,28,38]
"""
def index_words_iter(next):
    if text:
        yield 0 
    for index,  letter in enumerat(text):
        if letter == ' ':
            yield index + 1


메모리크기를 제한할 수 있다.

#입력 중 가장 긴 줄의 길이 제한
def index_file(handle):
    offset = 0
    for line in handle:
        if line:
            yield offset
        for letter in line:
            offset +=1
            if lette = ' ':
                yield offset
#파일에 유니코드 문자가 들어간 경우
#파일을 읽을 때 utf-8로 디코딩하도록 open에 인코딩 지정
with open('address.txt', ' r', encoding = 'utf-8') as f:
    it = index_file(f)
    results = itertools.islice(it,0,10)

print(list(results))
#[0,8,18,23,28,38]

Summary

  • 제네레이터를 사용하면 결과를 리스트에 합쳐서 반환하는 것 보다 깔끔

  • 제네레이터가 반환하는 이터레이터는 제너레이터 함수의 본문에서 yield가 반환하는 값들로 이뤄진 집합

  • 제너레이터를 사용하면 작업 메모리에 모든 입력과 출력을 저장할 필요없이 입력이 아주 커도 출력 시퀀스 가능

profile
성장을 도울 아카이빙 블로그

0개의 댓글