파이썬을 함수 부분을 작성하다가 non-default argument follows default argument error를 뜬적이 있을것이다.
없으면 말구요..
해당 에러를 읽기 위해서는 3가지 개념이 필요합니다.
1. positional argument
해당 선언은 우리가 보통 알고 있는 함수 선언 방식입니다.
예시코드로 세 숫자를 곱하고 더하는 출력해주는 함수를 정의해 봅시다.
def add(num1,num2,num3):
print(f"{num1} * {num2} + {num3}={num1 * num2 + num3}")
add(1,2,3)
결과 값은 -> "(1 * 2) + 3 = 6" 입니다.
Why 6일까요..
수학은 사직연산 우선순위가 매우 중요합니다. 위 코드에서는 * 먼저 그다음 +이죠
"(1 * 2) + 3 = 6" 이러한 답이 나오려면 각 각의 변수에 이렇게 할당 됩니다.
이렇게 add(1,2,3)이란 숫자가 순차적으로 변수에 할당 된 것을 볼 수 있습니다.
이러한 개념이 positional argument 개념입니다.
2. default parameter And non-default parameter
해당 개념은 함수를 선언 할때 변수에 미리 default값을 할당 하는 개념입니다.
위 1번개념에서 배웠던 예제코드를 조금 수정해서 default값이 들어가도록 수정 하겠습니다.
def add(num1,num2=0,num3=0):
print(f"{num1} * {num2} + {num3}={num1 * num2 + num3}")
add(1,2)
결과 값 :
신기 하군요 저의는 함수에 값을 3개를 입력 받도록 되어 있는데 2개만 주니 값이 나오는 군요
여기서 num1은 non-default parameter입니다
num2와 num3는 default-parameter가 되겠네요.
*참고로 타언어 C#에서는 optional value라고도 부릅니다. 즉 있어도 되고 없어도 되는 값을 의미 합니다.
따라서 함수의 argument는 positonal argument특성을 기본적으로 가지고 있고 default값이 있냐 없냐에 따라 나뉘는 군요!!
이렇게 할당되어 있네요.
하지만 여기서주의할 사항이 있습니다.
def add(num1=0,num2=0,num3):
print(f"{num1} * {num2} + {num3} = {num1 * num2 + num3}")
add(1,2)
혹시 어떤 위 코드와 비교해서 어떤 부분이 바뀌셨는지 눈치 체셨나요.
바로 Parameter에 default parameter부터 왔네요!!
위 코드의 결과 값은
앗!! 에러가 뜨는 군요..
에러 매시지를 해석해보면 이유를 알수 있습니다 어쩌면 당연한 결과일 수도 있죠.
해석 : "문법오류 : non-default argument는 default argment앞에 와야한다." 라고 하는군요.
그렇다면 여기서 non-default argument는 무엇을 의미하는 걸까요?
네!! 바로 num3이 non-default argument가 되겠군요.
위 그림과 같이 num3이 할당이 안되서 오류가 발생 한것을 알수 있습니다.
해결 방법 :
def add(num3,num1=0,num2=0):
print(f"{num1} * {num2} + {num3} = {num1 * num2 + num3}")
add(1,2)
위와 같이 non-default parameter을 첫 번째에 두고 있어도 되고 없어도 되는 default parameter을 뒤로 두면 해결이 됩니다.
참고로 아래 그림의 순서가 중요합니다.
3. variable length arguments
variable length arguments란 여러개의
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)
이를 실행하면 에러가 납니다.
해석 : keyword-only argument age는 1개의 값을 요구 하는데 그것이 없다는 오류입니다.
위 그림을 보면 Variable Length Argument 다음에 Keyword-only 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("정우성", "01012341234", "seoul", age=20)
age=20 이라고 해서 Keyword-only parameter 으로 변경해 줍니다.
4. variable length Keyword arguments
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")
해당 문제도 arguments 순서 때문에 발생하는 문제입니다.
**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")
이대로 끝나기 아쉬우니 좀더 긴 코드로 보겠습니다.
def mixed_params(name="wecode", *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")
위 함수 arguments 순서 사진을 보면서 맞춰주면 끝납니다.
def mixed_params(age, name="wecode", *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")
결과
'Python' 카테고리의 다른 글
[Python] 패키지 생성 실습 (0) | 2020.06.26 |
---|---|
[Python] Sys modules (0) | 2020.06.25 |
[Python] pygame 으로 벽돌깨기 만들기 part-7 (0) | 2020.05.25 |
[Python] pygame 으로 벽돌깨기 만들기 part-6 (0) | 2020.05.24 |
[Python] pygame 으로 벽돌깨기 만들기 part-5 (0) | 2020.05.24 |
댓글