Parameter에는 우선순위가 존재한다.
우선순위를 통해 출력값에 Error가 뜨는 경우가 많은데
아래 경우를 통해 학습해보자.
<출처 = getkt.com>
1) positional arguments(위치파라미터)
2) default arguments(default값이 지정된 파라미터)
3) Variavle Length Positional Arguments(가변인수를 받는 파라미터)
4) Non-Default Keyword-Only Arguments(키워드 인수를 받는 파라미터)
5) Keyword-Only Arguments(파라미터가 키워드로 되어있는 인수)
6) Variable Length Keyword Arguments(키워드 가변인수를 받는 파라미터)
def love_you(my_name = "정우성", your_name): print(f"{my_name} loves {your_name}")
Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
위의 경우 처럼 default 값이 정의된 parameter가 default 값이 정이 되지 않은
parameter보다 먼저 위치해 있으면 syntaxError가 발생한다.
위치인수
함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미하며, 가장 자주 사용되는 방식
가변인수
인수의 개수가 변할 수 있다는 의미이며, 가변인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미
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) -------------------------------------------------------------------------------------------------------------------------- TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
라고 Error가 뜨는 이유는 *args 와 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("정우성", "01012341234", "seoul", 20) -------------------------------------------------------------------------------------------------------------------------- name=정우성 args=('seoul', 20) age=01012341234
라고 정상적으로 출력되는 것을 볼 수 있다.
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가 0이라는 default 값을 갖게 되기 때문에 positional parameter인
name, age 뒤에 위치시켜줘야 한다.
address=0 의 위치와 **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") -------------------------------------------------------------------------------------------------------------------------- name=정우성 age=20 kwargs={'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") -------------------------------------------------------------------------------------------------------------------------- def mixed_params(name="아이유", *args, age, **kwargs, address): ^ SyntaxError: invalid syntax
위와 같이 Syntax Error가 나는 것을 볼 수 있다.
positional parameter인 age를 가장 앞으로 옮겨주고
age, *args, name="아이유", address, **kwargs의 순으로
위치시켜주게 되면
def mixed_params(age, *args, name="아이유", 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") -------------------------------------------------------------------------------------------------------------------------- name=아이유 args=('정우성', '01012341234', 'male') age=20 kwargs={'mobile': '01012341234'} address=seoul
정상적으로 결과값이 출력되는 것을 볼 수 있다.
끝!