python에서 함수를 사용 할 때 매개변수(parameter)을 사용하여 코드를 실행한다. (매개변수가 없을 수도 있음)
함수를 호출하여 매개변수를 넘겨 줄 때 주의해야 점이 몇가지 있다.
def add(n1, n2=3):
return n1 + n2
add(2)
위의 예제를 보면 n2가 default 값으로 3이 설정되어 있다. add(2)로 함수를 호출하면 n1=2, n2=3이 되어 5가 return 된다.
def add(n1=3, n2):
return n1 + n2
add(2)
위의 예제는 n1=3으로 default 값이 정해져 있다. add(2)로 함수로 호출하게 되면 n1=2가 되고 n2에는 매개변수가 전해 지지 않아 함수가 실행되지 않는다.
default value parameter를 non-default value parameter 앞에 정의 되면 전달되는 매개변수의 수의 차이가 발생하게 되어 함수가 실행 되지 않는다.
전달 받을 parameter의 수가 정해지지 않을 때 (*)을 붙혀 사용하고, 함수에는 tuple형태로 들어온다.
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)
위의 코드를 실행하면 다음과 같은 error가 발생한다.
에러의 원인은 name = "정우성", *age = ("01012341234", "seoul", 20) 이 전달 되어 age에 전달될 parameter가 없기 때문이다.
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")
args와 age의 순서을 바꾸고, 함수 호출수 20을 2번째 인자로 넘겨주어 age = 20, age = ("01012341234", "seoul")으로 전달되게 하였다.
전달 받을 parameter의 수가 정해지지 않을 때 (**)을 붙혀 사용하는데, 가변인수가 value만 넘겨주었다면 가변키워드인수는 keyword까지 넘겨주어 함수 내에서 dictionary로 동작한다.
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")
가변키워드인수를 사용할 때 문법적으로 일반 인수들은 가변키워드인수 앞에 있어야 한다. 따라서 위의 코드를 실행 할 경우 다음과 같은 에러가 발생한다.
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")
adress와 **kwargs의 위치를 바꾸어 에러를 해결 하였다.
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")
1) default prameter가 non-default prameter보다 앞에 있음
2) address paramerter가 가변키워드인수보다 앞에 있음
위의 두 가지를 수정하면 코드가 정상적으로 실행된다.
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" ,mobile="01012341234", address="seoul"