함수를 정의할 때 매개변수를 어떤 형식과 순서로 지정하느냐에 따라서 함수를 호출할 때 입력하는 인자값이 달라질 수 있다. 그리고 파이썬에서 매개변수를 입력하는 순서는 정해져 있다.
위치 인자 - 기본값(default) 인자 - 가변 인자 - 키워드 인자 - 키워드 가변 인자
Defalt value parameter
함수가 호출될때 파라미터에 인자를 받아 넘겨준다.
non-defalut value parameter
함수가 호출될때 파라미터에 인자를 받아 넘겨줄 수 도 있으며, 인자를 넘겨주지 않아도 keywordname=value 형식으로 선언되어 있기 때문에 지정한 value 를 넘겨줄 수 있다.
위치 인수가 parameter에 할당될 때 왼쪽에서 오른쪽 순서의 방향성이 존재한다.
따라서 default value parameter를 non-default value parameter앞에 정의하고 argument를 1개만 전달하면 해당 argument는 default value parameter에 할당되므로 non-default value parameter는 할당받는 값이 없어서 오류를 발생하게 된다.
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 File "/Users/sh_awtylol4/Desktop/pythonwork/pypyp.py", line 6, in <module> func_param_with_var_args("정우성", "01012341234", "seoul", 20) TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age' sh_awtylol4@gimsuhun-ui-MacBookAir pythonwork %
*args 와 age 의 위치가 바뀌었기 때문에 에러가 뜬다.
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") ========================================================= # error SyntaxError: invalid syntax
가변인수 뒤에 address가 위치해 있기 때문에 error가 발생한다.
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") ================================================ # error SyntaxError: invalid syntax
위치 인수인 age를 첫번째 매개변수로 이동시켜주고 kwargs
**를 맨 뒤로 옮겨준다. adderss는 키워드 전용 인수이므로 가변 인수 뒤 가변 키워드 인수 앞에 위치한다.
def mixed_params(age, name="아이유", *args, address=0, **kwargs): print("age=",end=""), print(age) print("name=",end=""), print(name) print("args=",end=""), print(args) print("address=",end=""), print(address) print("kwargs=",end=""), print(kwargs) mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul") ======================================================= age=20 name=정우성 args=('01012341234', 'male') address=seoul kwargs={'mobile': '01012341234'}