가변 개수의 위치 인수를 받는 예제

def log(message, values):
    if not values:
        print(message)
    else:
        value_str = ", ".join(str(x) for x in values)
        print("%s: %s" % (message, values_str))

log("My numbers are", [1, 2])
log("Hi there", [])             # 빈 리스트를 넘겨야 하는 것이 불편함

>>>
My numbers are: 1, 2
Hi there
def log(message, *values):  # 첫 번째 파라미터인 message는 필수, 그 다음에 나오는 위치 인수는 몇 개든 선택적임
    if not values:
        print(message)
    else:
        value_str = ", ".join(str(x) for x in values)
        print("%s: %s" % (message, values_str))

log("My numbers are", 1, 2)
log("Hi there")             # 호출하는 쪽만 수정

>>>
My numbers are: 1, 2
Hi there
def log(message, *values):  # 첫 번째 파라미터인 message는 필수, 그 다음에 나오는 위치 인수는 몇 개든 선택적임
    if not values:
        print(message)
    else:
        value_str = ", ".join(str(x) for x in values)
        print("%s: %s" % (message, values_str))

favorites = [7, 33, 99]
log("Favorite colors", *favorites)

>>>
Favorite colors: 7, 33, 99

가변 개수의 위치 인수를 받는 방법의 문제점

def my_generator():
    for i in range(10):
        yield i

def my_func(*args):
    print(args)

it = my_generator()     # 제너레이터 생성
my_func(*it)            # 제너레이터를 모두 순회하며 생성되는 값들이 전부 튜플로 변환: 메모리 문제 발생 가능

>>>
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
def log(sequence, message, *values):
    if not values:
        print("%s: %s" % (sequence, message))
    else:
        values_str = ", ".join(str(x) for x in values)
        print("%s: %s: %s" % (sequence, message, values_str))
log(1, "Favorites", 7, 33)      # 새로운 용법은 OK
log("Favorite numbers", 7, 33)  # 오래된 용법은 제대로 동작하지 않음

>>>
1: Favorites: 7, 33
Favorite numbers: 7: 33     # sequence 인수를 받지 못했기 때문에 7을 message 파라미터로 사용