함수는 기본적으로 input parameter
를 받아서 return 값을 output으로 리턴
한다.
함수를 호출시 parameter를 함수에 건내주어 호출하는데,
함수의 parameter에는 여러가지 형태가 있다.
*args
사용, 튜플로 받음**kwrags
사용, 딕셔너리로 받음def apple(Mac, iPad):
print(f"{Mac} and {iPad}")
apple("lovemac", "loveipad")
# output = "lovemac and loveipad"
parameter를 순서에 맞추지 않고 값을 전하는 방법이 있는데,
이를 Keyword Arguments
라고 한다.
Keyword Arguments
방식으로 parameter값을
전해주면 실제 parameter 순서가 바뀌어도 에러가 나지 않고, 가독성 또한 높아진다.
def apple(Mac, iPad):
print(f"{Mac} and {iPad}")
apple(Mac="lovemac", iPad="loveipad")
# output = "lovemac and loveipad"
parameter 순서에 맞추어 값을 함수에 넘기는 경우
실수로 값이 바뀌어도 알기가 힘들다는 점이 있는데,
Keyword Arguments
는 parameter 이름에 맞추어 값을 함수에 넣기 때문에 실수로 값이 바뀔 확룔이 적다.
Positional arguments
와 Keyword arguments
를 함께 사용하는 것도 가능하다.
def apple(Mac, iPad):
print(f"{Mac} and {iPad}")
apple("lovemac", iPad="loveipad")
# output = "lovemac and loveipad"
이 방법에서의 중요한 점은,
Keyword arguments
가 Positional arguments
이
지정되어 있는 순서에 들어가게 되면 에러가 난다는 점.
def apple(Mac, iPad):
print(f"{Mac} and {iPad}")
apple(iPad="loveipad", "lovemac")
# output Error
> apple(iPad="loveipad", "lovemac")
SyntaxError: positional argument follows keyword argument
지금까지 함수를 호출할 때 parameter값을 지정하였는데,
함수를 호출하기 전 parameter에 default
값을 정의해줄 수 있다.
def apple(Mac, iPad="loveipad"):
print(f"{Mac} and {iPad}")
apple("lovemac")
# output = "lovemac and loveipad"
이 방법에서의 주의점은,
default
값이 먼저 정의 된 parameter
가default
값이 정의 되지 않은 parameter
보다 먼저 위치해 있으면 에러가 난다.
def apple(Mac="lovemac", iPad):
print(f"{iPad} and {Mac}")
apple(iPad="lovemac")
# output
> def apple(Mac="lovemac", iPad):
SyntaxError: non-default argument follows default argument
default argument
는 non-default argument
앞에 올 수 없다.
Default Argument
는 왜 Non-Default Argument
앞에 정의할 수 없는걸까?
SyntaxError: non-default argument follows default argument
란 즉,
"기본 인수가 아닌 인수가 기본 인수를 따른다." 라는 말로,
먼저Python parameter
의 순서를 보면
def func(a, b="Hello", *args, c, **Kwargs)
이다.
예를들어Keyword arguments
와Default Arguments
의 순서는 상관이 없는데,
이는 호출시 키워드를 입력하기 때문에각각의 parameter
를 구분할 수 있기 때문이다.
하지만Non-Default Argument
는 위치나 키워드가 정의되지 않은 상태기 때문에
함수 호출시 어떤 parameter를 생략한 것인지 알 수 없으므로,
순서는Non-Default Argument
->Default Argument
가 되어야 한다.
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("라라", "1004", "seoul", 3)
# output
func_param_with_var_args("라라", "1004", "seoul", 3)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: '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("라라", 3, "1004", "seoul")
# output
name=라라
args=('1004', 'seoul')
age=3
키워드 인자인 age
를 가변 인자인 *args
앞으로 옮기고
함수 호출시 출력되는 age
값의 위치를 옮겨 오류를 수정했다.
가변 인자*args
는 굳이 **args
가 아니어도 된다. *inah
, *rara
등 (튜플 형태로 출력)
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("라라", "3", mobile="1004", address="seoul")
# output
def func_param_with_kwargs(name, age, **kwargs, address=0):
^
SyntaxError: invalid syntax
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("라라", "3", mobile="1004", address="seoul")
# output
age=3
kwargs={'mobile': '1004'}
address=seoul
**kwargs
는 키워드 가변인자이다. 순서상 키워드 가변인자 뒤에는 어떤 인자도 올 수 없다.
**kwargs
뒤에 있는 address
를 앞으로 이동시키고 에러를 수정하였다.
키워드 가변인자 **kwargs
도 다른 이름을 지어줄 수 있다.
**inah
, **rara
등 (딕셔너리 형태로 저장)
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(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")
# output
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
순서상 키워드 가변인자 뒤에는 어떤 인자도 올 수 없으므로,
address
를**kwargs
앞으로 이동시켰다
변수를 address
키워드로 통일하여 키워드 인자로 변경하고
age
는 함수 호출시의 위치로 이동시켜 위치 인자로 사용하여
에러를 수정하였다.