오늘은 function parameter를 한번 이해보도록 하겠다!
def sum(a=1,b=2):
return a+b
sum(3)
>>5 # 여기서 1은 a로 들어간다.
sum()
>>3 #심지어 이렇게 아무인수를 넣지 않아도 에러가 남지 않는다.
def sum(a,b=2):
return a+b
sum(1) # 여기서 1은 a로 들어간다.
>>3
def sum(a=2,b):
return a+b
>>SyntaxError: non-default argument follows default argument
default parameter 가 있다는 것은 굳이 값을 정해주지않아도 사용할 값(default)이 있기 때문에 함수를 줄여 쓸 수가 있다.
default parameter가 앞에 오면 줄여서 썼을 때 의미가 모호해지고 처리가 파이썬 시스템에서
처리하기가 복잡해서 순서를 준 것이라고 생각했다.
이렇게 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", 20)
>> TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
다음과 같은 age
인자는 keyword only argument가 필요하다고 한다
def func_param_with_var_args(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
# 20 -> age=20으로 변경
func_param_with_var_args("정우성", "01012341234", "seoul", age=20)
>> name=정우성
>> args=('01012341234', 'seoul')
>> age=20
가변 인자뒤에 키워드 인자가 들어오지 않으면 모두 가변인자로 판단하기 때문에 사실상 처음 에러난 코드의 20은 args[2]에 들어갔기 떄문에 더이상에서 age에서 줄수 있는 arument가 없어서 에러가 난 것이다.
이때 keyword arument로 age를 특정지어주면 에러가 발생하지 않는다.
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("정우성", "20", mobile="01012341234", address="seoul")
>>SyntaxError: invalid syntax
def func_param_with_kwargs(name, age, address=0, **kwargs):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
>>name=정우성
>>age=20
>>kwargs={'mobile': '01012341234'}
>>address=seoul
def mixed_params(name="아이유", *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(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
>>SyntaxError: invalid syntax
def mixed_params(age,name="아이유", *args, address, **kwargs):
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(20, "정우성", "01012341234", "male", address='seoul', mobile="01012341234")
>>name=정우성
>>args=('01012341234', 'male')
>>age=20
>>kwargs={'mobile': '01012341234'}
>>address=seoul
이렇게 parameter에 성질에 따라 순서를 준 것은 보통은 가변 인자를 사용하면서 우선순위를 정해주지 않으면 어디까지가 어떤 매개변수에 들어가야하는지 모호해지기 때문에 에러처리하도록 한 것 같다.
뭐랄까 일반 매개변수는 positional argument로 받고 거기에 추가되는 변수는 *args로 받고 그중에 키워드로 되있는 것들은 또 **kwargs로 받는 다는 느낌이다.