가변인자 함수가 몇 개의 인자를 받을 지 모를 때 쓰는 함수이다.
def numbers(*args):
return args
numbers(1,2,3,4,5,6,7,8,9,10)
# 결과값
(1, 2, 3, 4, 5, 6, 7)
numbers 함수에 입력 값으로 받을 변수를 *args로 1개만 선언했지만 입력 값으로 받은 모든 숫자를 다 담았다.
이처럼 함수에 몇 개의 인자를 받을지 알 수 없을 땐 변수명 앞에 *를 붙여주면 된다.(관례적으로 변수명은 args로 한다)
가변인자도 정확한 위치에 선언해주지 않으면 오류가 발생하는데 아래 예시로 확인해보자.
def func_param_with_var_args(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
#TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
age 인자가 누락되었다는 메시지의 오류가 나타난다.
✔ 오류 발생 이유
*args는 입력 값을 무한대로 받을 수 있다.
*args를 다른 매개변수보다 먼저 선언되게 되면 앞의 입력 값을 모두 args가 받기 때문에 뒤의 매개변수는 받을 수 있는 값이 없다.
따라서 위의 코드 상에서는 age는 인자 값이 없는 상태가 된다.
앞의 name, age 매개변수에 차례대로 값이 입력된 후 이후 입력된 모든 값들을 *args로 받는 방법이다.
def func_param_with_var_args(name, age, *args):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", 20, "01012341234", "seoul")
함수의 default parameter 오류 해결 방법과 유사하다
함수 default parameter 정리
인수를 전달할 때 직접 매개변수에 특정 인수를 매칭시키는 방법이다.
def func_param_with_var_args(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", "01012341234", "seoul", age = 20)
위의 코드를 살펴보면 "정우성"으로 입력된 인수는 name에 입력되고 "01012341234" 와 "seoul"은 args에 입력된다.
뒤의 20은 age매개변수에 직접적으로 매칭을 시켜 값을 입력했다.
🚨 키워드인자 사용시 주의할 점
위 방법처럼 age라는 변수 이름에 직접 매칭시키는 걸 키워드 인자
name 변수 위치에 그대로 값을 넣어주는 걸 위치인자라고 한다.
키워드 인자를 사용할 때는 반드시 위치인자 뒤에 위치해야하는 규칙이 있으니 이를 잘 지켜서 이용해야 한다.
가변인자를 사용하면 입력 값이 고정되지 않은 상황에 유연하게 대처할 수 있다는 장점이 있으며, 다른 매개변수와 함께 사용하여 효율적인 함수를 작성할 수 있다.
다만, 가변인자는 에러 없이 사용하기 위한 규칙이 존재한다.
가변인자가 가진 특성(기능)과 함수를 호출하기 위해 입력한 인수가 어떤 방식으로 매개변수와 매칭되는지의 상관관계를 생각해가며 사용하면 이해하기 더 쉬울 것이다.