우선 default value parameter가 무엇인지 알 필요가 있다. default value parameter란 함수를 만들때 함수에 입력값을 넣지 않았을때 고정값을 갖는것이다. 쉽게 설명하면
def hello(a,b=1,c=2):
return a + b + c
이렇게 a,b,c의 합을 반환하는 간단한 함수가 있다고 가정하면 일반적으로는 호출할때 hello(1,2,3) 이렇게 3개의 arguments를 입력해서 값을 반환시킨다. 하지만 위의 코드처럼 b=1,c=2 라고 함수를 만들때 고정값을 입력시키면 우리가 hello(1)이라고 입력을 하면 a 에 1이 할당되고 b,c에는 입력값을 넣지 않았기 때문에 고정값 b=1,c=2 이 자동으로 입력된다.
하지만 여기서 주의해야 될 점은 함수를 만들때 default value parameter가 non-default value parameter 앞에 오면 안된다. 파이썬에서는 함수에 어떤 값을 입력시킬때 왼쪽에서 오른쪽 순서의 방향성이 있다.
따라서 default value parameter를 non-default value parameter 앞에 정의하고 argument를 1개만 전달하면 해당 argument는 default value parameter에 할당되므로 non-default value parameter는 할당받는 값이 없기 때문에 오류가 발생한다.
위치 인수란 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미하며, 가장 자주 사용되는 방식이다
가변 인수란 인수의 개수가 변할 수 있다는 의미이며, 가변인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미한다. 쉽게 설명하면,
def hello(a, *args):
print(args)
return a + sum(args)
hello(1,2,3,4,5)
(2, 3, 4, 5)
15
hello 함수에 다섯개의 argument를 입력하면 첫번째 1 의 값은 a에 할당되고 나머지 4개의 값은 튜플 형태로 args에 할당되는것을 볼 수 있다. 여기서 주의해야 될 점이 있다. *args의 위치가 중요한데 만약에
(name, args, age) 처럼 args가 name, age 매개변수 사이에 위치하게 되면 에러가 발생한다.
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
에러가 발생하는 이유는 만약 1,2,3,4,5 값을 입력시킨다고 가정하면 1은 name에 할당되지만 나머지 2,3,4,5는 args에 할당되어 age에 아무런 값도 할당되지 않는다. 이러한 에러를 방지하려면 (name, age, args) 처럼 가변인수를 맨 마지막에 입력해서 함수를 만들어야한다.
임의의 개수의 키워드 인자도 받을 수 있게 함수를 만들수도 있다. 쉽게 설명하면
def hello(a, **kwargs):
print(kwargs)
print(a)
이렇게 간단한 함수가 있다고 가정하겠다.
hello(1,flag=True, mode='fast', header='debug')
{'flag': True, 'mode': 'fast', 'header': 'debug'}
1
hello 함수에 1 과 여러개의 키워드 인자를 입력하면 키워드 인자들은 kwargs에 딕셔너리 형태로 할당되는것을 볼 수 있다.
여기서 주의해야 될 점은 default arguments 와 함께 사용할때이다.
위 사진처럼 파이썬에서는 함수를 만들때 arguments의 위치 순서가 중요하다.
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)
위 코드처럼 Default Arguments가 Variable Length Keyword Arguments 뒤에 위치하면 오류가 발생한다.
SyntaxError: invalid syntax
**kwargs 와 address=0 의 위치를 바꿔주면 오류가 해결된다.
SyntaxError: invalid syntax
이 함수에서도 3번과 같은 에러가 발생한다. Arguments들의 위치가 잘못되었는데 (age, *args, name="아이유", address, **kwargs) 순서로 바꾸면 에러가 발생하지 않는다.
결과값 :