더북(TheBook)

BETTER WAY 16
리스트를 반환하는 대신 제너레이터를 고려하자

 

 

일련의 결과를 생성하는 함수에서 택할 가장 간단한 방법은 아이템의 리스트를 반환하는 것이다. 예를 들어 문자열에 있는 모든 단어의 인덱스를 출력하고 싶다고 하자. 다음 코드에서는 append 메서드로 리스트에 결과들을 누적하고 함수가 끝날 때 해당 리스트를 반환한다.

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 = ‘Four score and seven years ago...’

result = index_words(address)

print(result[:3])

 

>>>

[0, 5, 11]

 

하지만 index_words 함수에는 두 가지 문제가 있다.

첫 번째 문제는 코드가 약간 복잡하고 깔끔하지 않다는 점이다. 새로운 결과가 나올 때마다 append 메서드를 호출해야 한다. 메서드 호출(result.append)이 많아서 리스트에 추가하는 값(index + 1)이 덜 중요해 보인다. 결과 리스트를 생성하는 데 한 줄이 필요하고, 그 값을 반환하는 데도 한 줄이 필요하다. 함수 몸체에 문자가 130개 가량(공백 제외) 있지만 그중에서 중요한 문자는 약 75개다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.