문제

사용자에게 음료를 주문받은 후 제조를 지시하는 프로그램을 만들었다. input_orders() 함수는 사용자로부터 n개의 주문을 입력받아 리스트로 반환한다. 이 함수를 이용해 음료를 세 개 입력받고 제조를 지시하도록 했다.

def input_orders(n):
    """n개의 음료를 주문받아 리스트로 반환한다."""
    return [input() for _ in range(n)]

# 음료 주문 세 개를 입력받아 각 음료마다 제조 지시한다
for drink in input_orders(3):
    print(drink, '만들어 주세요!')

이 프로그램을 실행하면, 음료 세 개를 먼저 입력받은 뒤 이어서 제조 지시를 세 번 한다.

아메리카노
카페라테
딸기 주스
아메리카노 만들어 주세요!
카페라테 만들어 주세요!
딸기 주스 만들어 주세요!

이 프로그램의 input_names() 함수에서 사용된 리스트 조건제시법을 생성기 식으로 수정하고 프로그램을 실행해 보아라. 실행 결과가 어떻게 달라지는지 확인하고, 왜 그런지 설명해 보아라.

코드

def input_orders(n):
    """n개의 음료를 주문받아 리스트로 반환한다."""
    return (input() for _ in range(n))

# 음료 주문 세 개를 입력받아 각 음료마다 제조 지시한다
for drink in input_orders(3):
    print(drink, '만들어 주세요!')

실행 결과

아메리카노
아메리카노 만들어 주세요!
카페라테
카페라테 만들어 주세요!
딸기 주스
딸기 주스 만들어 주세요!

리스트 조건제시법에서 input() 함수를 실행했을 때는 처음부터 입력을 세 번 다 받았고, 그 다음에 출력도 한꺼번에 됐다.

반면에, 생성기 식에서 input() 함수를 실행했을 때는 입력을 한 번 받고 출력을 한 번 하는 식으로 입력과 출력이 교차로 이뤄졌다.

생성기 식은 리스트 조건제시법과 달리 데이터를 처음부터 다 변환하는 것이 아니라 필요할 때 하나씩 변환하기 때문이다.

해설