Parameter Default Value
함수의 매개변수에 default값을 정의하면 함수 호출시 값이 넘겨지지 않아도 상관 없으며, 값이 넘겨지지 않은 경우, default 값이 자동으로 넘겨지게 된다.
이때, default value parameter를 선언할 때의 위치가 중요한데,
def love_you(my_name = "kim", your_name):
print(f"{my_name} loves {your_name}")
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
non-default value parameter 앞에 default value parameter를 선언하면 syntax error가 난다.
파이썬에서 파라미터를 받는 순서가 정해져 있고, 지키지 않을 시 오류가 발생함
def example(a, b, c=None, r='w', d=[], *ae, **ae)
-a, b: positional parameter
-c = none : optional parameter
-r = 'w' : keyword parameter
-d=[] : list parameter
-*ae : keyword-only
-**acb : var-keyword parameter
오류가 발생하는 이유는 파라미터를 정의하는 순서없이 생성하는 경우, 함수가 어떤 파라미터에 어떤 값을 받아야 될지 정할 수 없기 때문이다.
! 파이썬 3 이상부터 '*'를 이용하면 오류없이 사용가능
def fun1(a='kim', b='True', *, x, y):
pass
fun1(x=2, y=2)
positional arguments(위치인수)
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("kim", "01012341234", "seoul", 40)
이 경우, 아래와 같은 오류가 나오는데,
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
이 때, args 가 "kim" 다음부터의 값을 모두 가져가 age에 해당하는 argument를 받지 못한 것.
이 경우, 해결은 *args를 끝으로 보내면 해결
def func_param_with_var_args(name, age, *args):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("args=",end=""), print(args)
func_param_with_var_args("kim", 40, "01012341234", "seoul")
variable length keyword arguments(가변 키워드 인수)
def func_param_with_kwargs(name, age, **kwargs, address=0):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
func_param_with_kwargs("kim", "20", mobile="01012341234", address="seoul")
SyntaxError: invalid syntax
이번에는 위와 같은 오류가 나오는데, varable length keyword arguments가 다른 arguments의 뒤에 위치해야 하지 않았기 때문에 발생한 오류이므로, 가장 뒤에 위치해주면 해결
def func_param_with_kwargs(name, age, address=0, **kwargs):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("address=",end=""), print(address)
print("kwargs=",end=""), print(kwargs)
func_param_with_kwargs("kim", "20", address="seoul", mobile="01012341234")
positional arguments(위치인수) & variable length keyword arguments(가변 키워드 인수)
def mixed_params(name="lilo", *args, age, **kwargs, address):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
mixed_params(40, "kim", "01012341234", "female" ,mobile="01012341234", address="seoul")
위의 경우는, 위치 인수가 default value보다 뒤에 있기 때문에, 위치 인수를 앞으로 빼주고, 위치 인수 중 address가 키-값으로 받고 있어서 가변인수와 키워드 가변인수 사이로 넣어주면 오류가 해결된다.
처음에, 키-값으로 받기 때문에, address = 0으로 형식을 바꿔주고 위치를 이동시켰는데, 변경없이도 동작이 가능함
def mixed_params(age, name="아이유", *args, address, **kwargs):
print("age=",end=""), print(age)
print("name=",end=""), print(name)
print("address=",end=""), print(address)
print("args=",end=""), print(args)
print("kwargs=",end=""), print(kwargs)
mixed_params(20, "lilo", "01012341234", "female" , address="seoul", mobile="01012341234")