default은 초기화값이다. 예를 들어 2개의 인자를 받을때 하나는 계속 똑같고 , 하나만 바꾸고 싶을떄 default값을 설정해주면 코드의 가독성이 올라갈 것이다.
함수 parameter에 default값을 미리 선언해줄수도 있다.
def multiply(a,b=5):
print(f'{a} * {b}')
def plus(a=5,b):
print(a+b)
이렇게 하였을때, a값은 5로 고정이 된다. 물론 a에 다른 값을 주어도 괜찮다. 이로인해 문제가 발생하게된다.
def multiply(a=5,b):
print(f'{a} * {b}')
이렇게 선언하게 되면
SyntaxError: non-default argument follows default argument
이런 오류를 얻게 되는데 이는 multiply(6)을 하면 (1)에는 a=6으로 전달되서 오류가 뜨지 않지만 (2)에는 이 6이 a인지 b인지 알수가 없다. 그래서 default 값은 뒤에 있어야 한다.
def func_param_with_var_args(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
가변인수는 1개부터 여러개의 인자값을 얻을 수 있다.Packing은 묶는 것을 의미하고 Unpacking은 그 반대를 의미한다. *args을 통해서 여러가지를 저장할수 있게 되고 출력할떄 묶어놓은것을 풀어놓으므로 Unpacking이라고 할 수 있다.
def plus(a,*args):
sum = a
for i in args:
sum = sum + i
return sum
plus(3,4,5)를 하면 12라는 출력값을 얻게 된다.
함수에 입력해줄떄 args는 Packing ,값을 출력할떄의 args는 Unpacking
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
에서 나타나는 오류? *args는 가변인자로 1개뿐만 아니라 여러개의 인자를 얻을 수 있게 된다. 그렇지만 가변인자의 위치는 맨 뒤로 제한적인데 이유는 가변인자의 범위가 어디까지인지를 알 수가 없기 때문이다. 1개인지 2개인지 앞에 선언되어 있으면 그 코딩을 짠 사람만 알 수 있을것이다.
그래서 저 코딩에서 가변인자가 중간에 있기 때문에 오류가 난 것이고
def func_param_with_var_args(name, age, *args):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("args=",end=""), print(args)
이렇게 짠다면
name=정우성
age=20
args=('01012341234', 'seoul')
이렇게 하면 에러가 없어진다.
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)
kwargs또한 가변인자인데 args와 차이점은 args은 튜플의 형태로 받는다면 kwargs는 딕셔너리 형태로 받는다는 것이다. 여기서 나오는 에러는 가변인자가 앞에 있기 때문이다.여기서 그냥 address만 입력받았다면 튜플의 형태이기 때문에 오류가 발생하지 않았을것이다.
func_param_with_kwargs("정우성", "20",mobile="01012341234",address="seoul")
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)
이렇게 코드를 바꿔서 수정하는 방법이 있다.
address="seoul"도 딕셔너리와 같은 방식이 선언방식이기 때문에 어디까지가 kwargs인지 알수가 없기떄문에 일어난 오류다.
def func_param_with_kwargs(name, age,address="seoul",**kwargs ):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("address=",end=""), print(address)
print("kwargs=",end=""), print(kwargs)
address값을 주고 하는것도 방법이다.
def mixed_params(name="wecode", *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)
여기서도 에러가 발생하게 되는데
def mixed_params(age,address,name="wecode",*args, **kwargs):
print("age=",end=""), print(age)
print("address=",end=""), print(address)
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("kwargs=",end=""), print(kwargs)
이렇게 수정하면 에러는 사라지게된다. args는 튜플의 형태 kwargs는 딕셔너리의 형태로 받는다는걸 잊어서는 안된다.kwargs는 key값도 같이 저장하는 점에서 args와의 차이점을 보인다고 할 수 있다.
mixed_params(20,"seoul", "정우성", "01012341234", "male" ,mobile="01012341234")
->address=seoul
age=20
name=정우성
args=('01012341234', 'male')
kwargs={'mobile': '01012341234'}