본문 바로가기
Python

[Python] funciton of arguments, parameter

by UnoCode 2020. 6. 24.

파이썬을 함수 부분을 작성하다가 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가 되겠군요.

 

num1과 num2는 1과 2라는 값이 할당이 되어 있지만 num3값이 할당이 안된 모습

위 그림과 같이 num3이 할당이 안되서 오류가 발생 한것을 알수 있습니다.

 

해결 방법 : 

def add(num3,num1=0,num2=0):
  print(f"{num1} * {num2} + {num3} = {num1 * num2 + num3}")
    
add(1,2)

위와 같이 non-default parameter을 첫 번째에 두고 있어도 되고 없어도 되는 default parameter을 뒤로 두면 해결이 됩니다.

 

참고로 아래 그림의 순서가 중요합니다.

https://getkt.com/blog/python-keyword-only-arguments/

 

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")

 

결과

 

 

 

댓글