함수는 input parameter
를 받아서 returs
값을 output
으로 리턴한다.
그리고 함수를 호출할 때 parameter
를 함수에 건내주어서 호출한다. 함수의 parameter
에는 여러가지 형태가 있다.
가장 기본적인 경우이다. 순서대로 값이 parameter로 함수에 전해지는 경우이다.
기본적인 경우와는 다르게 순서를 신경쓰지 않고 parameter에 값을 전해주는 방법도 있다. 순서가 아닌 이름으로 값을 전달해주는 경우인데 이 경우가 keyword argument
이다. Keyword arguments
방식으로 parameter 값을 전해주면 실제 parameter 순서가 바뀌어도 괜찮다.
순서가 바뀌는 점 말고 또 다른 장점으로는 가독성이 좋아진다. 값을 넘길때부터 명확히 이름으로 넘기기 때문에 이름만 보아도 어떤 값을 넘기는지 더 파악하기 좋다. 또한, 순서에 신경써야 하는 경우 순서를 잘못 입력하면 에러로 이어지지만 keyword argement
같은 경우는 이름으로 넘기기 때문에 순서를 잘못 입력해두어도 실수로 값이 바뀌는 경우는 상대적으로 적다.
순서를 맞추어서 parameter
값을 전해주는 positional arguments
와 keyword arguments
를 혼용하여 사용하는것도 가능하다.
다만 여기서 중요한것은 keyword arguments 는 순서가 바뀌어도 상관 없지만 positional arguments 부분은 순서를 지켜줘야 한다는 것이다.
함수의 parameter
에 default
값을 정의해 줄 수 도 있다. Default 값이 정의된 paramter는 함수가 호출될때 값이 넘겨지 않아도 괜찮다. 값이 넘겨지 않은 경우 default
값이 자동으로 넘겨지게 된다.
주의 : default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter 보다 먼저 위치해 있으면 안된다.
파이썬에서 파라미터를 받는 순서는 규칙으로 정해져있고 그 규칙은 다음과 같다.
def compute(a, b, c, *more, print_result=False, ignore_execeptions=True, **kwargs):
...
위의 규칙을 지켜주지 않으면 파이썬에서는 어떤 파라미터에 어떤 값을 받아야할지 정할 수 없게되어 오류가 발생한다. 이전에 *args
와**kwargs
에 대해 공부할때에도 순서가 중요했는데, **kwargs
가 *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("정우성", "01012341234", "seoul", 20)
func_param_with_var_args() missing 1 required keyword-only argument: 'age'
function
의 'age'
parameter에 필요한 argument
가 할당되지 않았다는 오류인데, 이 오류는 *args
때문에 발생했다. 여러개의 arguments를 받아 tuple 형태로 리턴해주기 때문에, 호출할 때 받은 인자중 *args
를 포함한 그 뒤의 있는 인자는 모두 *args
에 할당되기 때문에 age
가 할당되지 않은것이다. 따라서 age
를 지워주면 된다.def func_param_with_var_args(name, *agrs):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
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, **kwargs, address=0): ^ SyntaxError: invalid syntax
address
부분에서 문법적인 오류가 발생했으니 이부분에 대해 확인하면 될 듯 싶다.
파이썬의 파라미터 규칙에 의하면 **kwargs
는 가장 뒤에 위치해야한다. 따라서 위치를 다음과 같이 수정해주자.
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")
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
이번에도 문법적인 오류가 발생했다. 위의 문제에서 해결한방법으로 **kwargs
의 위치를 가장 뒤로 옮겨주자.
def mixed_params(name="아이유", *args, age, 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")
실행시켜보니 첫번째 문제와 같은 오류가 동일하게 발생했다.
TypeError: mixed_params() missing 1 required keyword-only argument: 'age'
age
에 할당할 수 없다고 하니 다시 한번 age
를 호출 순서에 맞춰준다.
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")
이제 위 코드를 동작시켜보면 정상동작하는것을 확인할 수 있다.