평소 함수를 짜다보면, 다음과 같이 인수의 개수가 고정된 형태로 많이 짰을 것이다.
def print_product(item):
print(item)
print_product('coffee',10) # 오류
기본 인수는 이렇듯 고정된 인자만 받지만, 인자의 개수가 변한다면 어떨까?
아마도 일일이 인자 개수에 맞춰 함수를 새로 만들어줘야 할 것이다.
이를 해결할 수 있는 것이 가변인자이다.
인자에는 *을 쓴다.
def print_product(*args):
print(args)
print_product('coffee','bread') # ('coffee','bread')
이것처럼 자유롭게 인자 개수를 조절할 수 있다.
출력되는 형식은?보다시피 튜플이다.
즉, *args의 리턴 타입은 튜플이다.
꼭 args라는 이름을 써야하나?
args의 이름이 아니어도 된다. 중요한 것은 '*'을 붙이는 것이다.
하지만 관례 상 args를 쓰는게 좋다.
다음과 같은 두 함수가 있다.
def func1(*values,a,b):
pass
func1(1,2,3,4,5)
def func2(a,b,*values):
pass
func2(1,2,3,4,5)
두 함수 중 어떤 것이 오류가 날까? 답은 func1이다.
*가 붙으면, 함수 호출 시 해당 순서 이후로 받는 파라미터들을 다 가변인자로 인식한다.
따라서 func1에서 *values는 첫번째부터 마지막 파라미터들을 다 가변인자로 인식하여 a,b가 초기화되지 않아 오류가 난다.
key='value'형태로 인자를 넣어주면 딕셔너리 형태로 변환하는 가변인자
리턴 타입이 딕셔너리다.
예시로 보는게 더 빠르겠다.
def print_food(**kwargs):
print(kwargs)
print_food(dinner='soup') # {'dinner':'soup'}
즉, 인자에 key=value값을 넣어주면 딕셔너리 반환을 한다.
여기서 중요한 점!
여기서 반환되는 딕셔너리는, key를 쌍 따옴표로 감싸야 제대로 조회가능하다!