함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다.
왜 안돼야만 하는지 생각해보시고 블로깅 하여 채널에 공유해 주세요.
모든 parameter는 어떠한 default value parameter보다 앞에 위치해야한다. 왜냐하면 parameter는 여러 형태가 있는데 가장 기본적인 형태는 순서대로 값이 함수에 전해지기때문이다.
밑에 첫번 째 예시코드를 보면 default 값이 정의된 인수가 먼저 위치해있으면 문법적 오류가 생긴다. 이 이유는 파이썬에서 그 default 값이 어떤 인수를 말하는 건지 알 수 없기 때문이다.
def test_func(a="korean", b="spanish", x, y):
print(a, b, x, y)
test_func("world", "hello")
SyntaxError: non-default argument follows default argument
반면에, 아래 예시에서는 정의되지않은 인수를 정의된 인수 앞에 위치시켜야만 함수가 제대로 호출되는 것을 볼 수 있다.
def test_func(x, y, a="korean", b="spanish"):
print(a, b, x, y)
test_func("world", "hello")
korean spanish world hello
따라서 반드시 기본값이 정의해있지 않은 parameter가 먼저 위치해 있어야 한다.
위치 인수(positional argument): 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수. 가장 자주 사용한다.
def print_number(a, b, c):
print(a, b, c)
print_number(7, 8, 9)
7, 8, 9 # 출력 값
가변 인수(variable argument): 인수의 개수가 변할 수 있다는 의미이고, 가변 인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미한다.
def myFun(*argv):
for arg in argv:
print (arg)
myFun('Hello', 'Welcome', 'to', 'GeeksforGeeks')
Hello #출력 값
Welcome
to
GeeksforGeeks
위치 인수를 가변인수 뒤에 선언하면 아래와 같이 오류가 생긴다.
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)
Traceback (most recent call last):
File "python", line 7, in <module>
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("정우성", 20, "01012341234", "seoul")
이 오류를 해결하기위해서 age와 *args의 순서를 바꿔주고, 호출하는 함수의 입력값의 순서를 바꿔준다. 이렇게 하면 가변 인수는 컴퓨터가 읽는 순서에 따라서 남아있는 인수들을 튜플로 묶어서 나타내기때문에 함수가 잘 호출되는 것을 볼 수 있다.
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")
Traceback (most recent call last):
File "python", line 1
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("정우성", "20", mobile="01012341234", address="seoul")
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
이 오류 또한 다른 문제들과 비슷하게 가변 키워드 인수가 마지막에 위치하지않아서 생기는 오류로 함수에서 가변 키워드 인수의 위치를 마지막으로 변경해주고, default 값이 있는 address를 위치 인수 뒤에 위치시키면 함수가 잘 호출되는 것을 알 수 있다.
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")
Traceback (most recent call last):
File "python", line 1
def mixed_params(name="아이유", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax
또 다시 문법 오류.
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")
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
컴퓨터가 읽는 순서에 따라서 age(위치 인수)를 제일 앞으로 옮기고, address와 **kwargs의 위치를 바꾼면 함수가 오류 없이 호출이 된다.