시퀀스를 결과로 만들어내는 함수를 만들기
#가장 간단한 방법
"""
코드의 잡음이 많아서 가독성을 해친다(핵심을 알아보기 어려움)
잦은 메서드 호출로 리스틑에 추가될 값의 중요성 희석
"""
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]
제네레이터를 사용하면 결과를 리스트에 합쳐서 반환하는 것 보다 깔끔
제네레이터가 반환하는 이터레이터는 제너레이터 함수의 본문에서 yield가 반환하는 값들로 이뤄진 집합
제너레이터를 사용하면 작업 메모리에 모든 입력과 출력을 저장할 필요없이 입력이 아주 커도 출력 시퀀스 가능