오늘은 Python function에 입력할 수 있는 parameter와 arguments에 어떤 종류가 있는지, 그리고 각 종류를 어떤 순서로 function definition 및 function call에 입력해야 하는지 알아보자~
먼저 Python function 기본에 대해 recap 해봅시다.
def new_funtion(param1, param2): code block
new_function('first arg', 'second arg')
Python에서 function argument의 종류는 다음과 같다:
Positional argument는 "position"이 정해진, 즉 순서가 정해진 argument이다. 때문에 해당되는 parameter의 순서에 맞게 입력해야 한다.
def new_function(param1, param2): code block
new_function('first arg', 'second arg')
Keyword argument는 argument값을 "keyword"로 지정해서 입력한다는 개념으로, 해당되는 parameter의 순서와는 다른 곳에 입력해도 되는 argument 이다
def new_function*(param1, param2): code block
new_function(param2='second arg', param1='first arg')
!(Argument 순서)!
keyword argument는 순서를 바꿔서 입력해도 되지만, positional argument는 순서가 바뀌면 안되기 때문에 keyword argument는 positional argument 보다 먼저 입력되면 안된다!
틀린 경우 예시:
def new_function(param1, param2):
new_function(param2='second arg', 'first arg')
Argument를 입력 안해도 미리 설정한 default 값으로 function이 실행되게 하려는 경우, parameter에 default value를 지정하는데, 이 형식도 keyword argument다.
def new_function(param1, param2=0): code block
new_function('first arg')
!(Argument 순서)!
Default parameter 또한 keyword argument이기 때문에 positional argument인 (default value가 지정 안된) parameter들 보다 뒤에 와야 한다.
틀린 예시
def new_function(param1=0, param2): code block
new_function('second arg')
사전에 몇개의 argument가 입력될 지 불분명 할 때는 arbitary argument를 사용할 수 있는데, positional argument를 갯수 제한 없이 입력 할 수 있게 하려는 경우 arbitrary positional argument를 쓸 수 있다. 이때 parameter를 *args
로 입력한다.
*args
는 function에 입력된 지정되지 않은 모든 positional arguments를 tuple 형식으로 arg
parameter에 정리한 것이다.
def new_function(param1, param2, *args): print('param1: ' + param1) print('param2: ' + param2) for arg in *args: print('this is an arbitrary arg: ' + arg)
new_function('first arg', 'second arg', 'arg1', 'arg2')
# result: param1: first arg param2: second arg this is an arbitrary arg: arg1 this is an arbitrary arg: arg2
!(Argument 순서)!
*args
도 positional argument에 해당하기 때문에 다른 keyword arguments 보다 순서가 먼저다.
*args와 같이 arguments 갯수에 제한을 두지 않으면서 positional arguments가 아닌 keyword arguments에 해당하는 경우, arbitrary keyword argument를 활용하며, 이때 parameter를 **kwargs
로 한다.
**kwargs
는 function에 입력된 지정되지 않은 모든 keyword arguments를 dictionary 형식으로 kwarg
parameter에 정리한 것이다.
def new_function(param1, param2, **kwargs): print('param1: ' + param1) print('param2: ' + param2) print('kwargs: ', end=''), print(kwargs)
new_function('first arg', 'second arg', kwarg1='first kwarg', kwarg3='third kwarg', kwarg2='second kwarg')
# result: param1: first arg param2: second arg kwargs: {'kwarg1': 'first kwarg', 'kwarg3': 'third kwarg', 'kwarg2': 'second kwarg'}
!(Argument 순서)!
**kwargs
도 keyword argument에 해당하기 때문에 다른 positional arguments 보다 순서가 뒤로 가야한다.
이제 모든 argument 종류를 전부 동시에 사용할 경우 순서 rule을 정리해보자:
- positional arguments
- arbitrary positional arguments(*args)
- keyword arguments (default parameters 포함)
- arbitrary keyword arguments(**kwargs)
def mixed_params(age, address, *args, name="라이언", **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, "Seoul", "01012345678", "male", name="어피치", mobile="01012345678")
# result name=어피치 args=('01012345678', 'male') age=20 kwargs={'mobile': '01012345678'} address=Seoul
Special Note on default parameters
위 예시에서 볼 수 있듯, default parameter를 arbitary arguments와 함께 사용할 경우, function call argument도 keyword argument로 입력 해줘야 한다.
*args
와 **kwargs
사이에 위치하는데, kwarg
앞에 keyword 없이 argument값만 입력 할 경우 이는 arg
로 인식되고, kwarg
뒤에는 kwarg
가 이미 keyword argument기 때문에 keyword 없이 입력할 수 없기 때문kwarg
앞으로 올 수도 있고 뒤로 갈 수도 있다. 둘다 keyword argument이기 때문