자바스크립트와 마찬가지로, 파이썬 함수에서도 parameter와 argument는 optional하다.
def names(name1, name2, name3):
print(f"{name1} is funny, {name2} is cute but {name3} is dumm and ugly")
names("Chandler", "Joey", "Ross")
name1, name2, name3는 names 함수의 parameter이며, 함수를 호출할 때 대입한 "Chandler", "Joey", "Ross"는 함수의 Argument이다.
Parameter을 한국어로 '매개 변수'라고 한다. 즉 가변적이라는 것이다. 하지만 파이썬에서는 이 parameter에 디폴트 값을 지정할 수 있는데, 이를 default value parameter라 한다.
def love(name="myself"):
print(f"I love {name}")
love("James") //I love James
love() //I love myself
이렇듯 디폴트값을 지정해주면 argument를 설정하지 않은 경우 디폴트값을 argument로 받는다. 물론 argument를 따로 설정해줄 경우에는, 동 값을 argument로 받는다.
Non-default parameter를 default parameter 뒤에 사용하면 SyntaxError가 발생하므로, 파이썬에서는 항상 non-default parameter를 먼저 설정하고 defulat parameter를 사용하여야한다.
Default parameter가 있을 경우, 함수를 호출할 때 argument가 비어있을 수 있다. 동 경우에도 디폴트 값을 사용해서 함수를 실행시킬 수 있기 때문이다. 하지만 non-defulat parameter의 경우 항상 argument가 필요하다.
def sum1(a, b = 3):
print(a+b)
sum1(5)
def sum2(c = 5, d):
print(c+d)
sum2(3)
이렇게 sum1과 sum2라는 함수를 정의하였다. sum1의 경우, 필요한 argument는 두 개지만 문제 없이 실행된다. a는 5를 받고, argument를 받지 못한 b의 경우 디폴트 값이 3을 받을 것이기 때문이다. 반면 sum2는 에러가 나타날 것이다. argument로 받은 3이 c의 디폴트 값을 대체하고, d에는 어떠한 argument도 할당되지 않았기 때문이다. 따라서 항상 non-default parameter가 먼저 위치해야 한다.
JS의 경우 argument의 순서는 반드시 parameter의 순서를 따라야한다. 하지만 파이썬에서는 그렇지 않다. Named Argument가 존재하기 때문이다.
def comparison(smaller, bigger):
print(f"{bigger} is bigger than {smaller}")
comparison(bigger=50, smaller=40) //50 is bigger than 40
comparison(40, 50) //50 is bigger than 40
함수 comparison은 작은 수와 큰 수 argument를 받는다. parameter의 순서는 작은 수가 먼저이지만, named argument를 사용함으로써 'bigger' 값을 먼저 입력할 수도 있다.
"*args" is used to send a non-keyworded variable length argument list to the function.
"**kwargs" allows you to pass keyworded variable length of arguments to a function. You should use **kwargs if you want to handle named arguments in a function.
Arg와 kwagr는 모두 함수에 대입할 argument의 수가 정해지지 않은 경우 사용된다.
argument는 다음의 순서를 따라야 한다.
- Known positional arguments
- *args
- Known named arguments
- **kwargs
에러가 나타나는 함수 고치기!
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("Nina", "01088887265", "Incheon", 25)
사람은 맨 뒤에 숫자 25가 age라는걸 알겠지만, 컴퓨터는 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("Nina", "01088887265", "Incheon", age = 25)
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("Nina", "25", mobile="01088887265", address="Incheon")
argument의 순서가 잘못되었다.
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("Nina", "25", address="Incheon", mobile="01088887265")
def mixed_params(name="ChaeYeong", *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(25, "Nina", "01088887265", "female" ,mobile="01088887265", address="Incheon")
Default parameter가 non-default인 age보다 먼저 나왔다(address는 named이기때문에 상관없음) 또한 kwarg argument가 named argument보다 먼저 나왔다.
def mixed_params(name="ChaeYeong", *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, "Nina", "01088887265", "female" ,mobile="01088887265", address="Incheon")