위인자 == 가변인자, 스타인자(*args
)
def log(message, values):
if not values:
print(message)
else:
values_str = ', '.join(str(x) for x in values)
print(f'{message}: {values_str}')
log('My numbers are', [1, 2])
log('Hi there', [])
>>>
My numbers are: 1, 2
Hi there
log('Hi there', [])
→ 두 번째 인자를 생략하기 위해서는 마지막 위치 인자 이름 앞에 *
를 붙이면 됨
log()에서 첫 번째 인자는 반드시 필요하지만, 두 번째 인자는 선택사항이 됨
def log(message, *values):
if not values:
print(message)
else:
values_str = ', '.join(str(x) for x in values)
print(f'{message}: {values_str}')
log('My numbers are', [1, 2])
log('Hi there') # 깔끔
이미 시퀸스(리스트 등)이 있을 때 log() 같은 함수에 시퀸스를 넘기로 싶다면 * 연산자를 사용하면 됨
연산자는 파이썬이 시퀸스의 원소들ㅇ르 함수의 위치 인자로 넘길 것을 명령함
def log(message, *values):
if not values:
print(message)
else:
values_str = ', '.join(str(x) for x in values)
print(f'{message}: {values_str}')
favorites = [7, 33, 99]
log('Favorite colors', *favorites)
>>>
Favorite colors: 7, 33, 99
log('Favorite colors', *favorites)
) 에서 제너레이터 앞에 * 연산자를 사용하면 제너레이터의 모든 원소를 얻기 위해 반복한다는 뜻⇒ *args
를 받는 함수의 인자는 인자의 개수가 적을 때 사용하면 좋음
*args
를 받아들이는 함수를 확장할 때는 키외드 기반의 인자를 지정하게 해서 함수 호출을 명확(better way 25)하게 하거나, 타입 애너테이션을 사용(better way 90)하면 됨