[python] default value parameter / non-default value parameter

내용에 대해 이야기 하기에 앞서, 제가 헷갈리는 parameter와 argument의 용어를 명확히 하도록하겠습니다.

  • parameter : 함수를 정의하는 경우, 필요한 변수. 매개변수를 말합니다.
  • argument : 정의된 함수를 부를 때, 매개변수에 전달되는 값, 즉 인자값을 말합니다.

parameter(매개변수)

  • 함수를 정의하는 경우에 필요한 변수를 parameter라고 합니다.
  • parameter의 인자값(argument)이 전달되는 형태로는 크게
    1. 입력 순서대로 값이 전해지는 'positional argument'형태
    1. 키워드를 명시하는 'keyword argument' 형태
    2. 1, 2를 혼합한 형태 (이 때, positional argument의 입력순서를 지키지 않으면 에러가 납니다.)
      가 있습니다.

default value parameter / non-default value parameter란 무엇일까요?

  • 함수를 정의하면서 parameter의 기본값을 정의해줄 수 있는데요, 이렇게 기본값이 정의된 parameter를 'default value parameter'라고 합니다.
  • 이와는 달리 기본값이 정의되지 않은 parameter는 non-default value parameter라고 합니다.
  • default value parameter는 함수가 호출될 때, 값을 입력하지 않으면 기본값을 자동으로 넘기게 됩니다.
  • 아래의 예시를 봐주세요!
def movie(title, genre="드라마"):
	print(f"영화 : {title}({genre})")

movie("Closer") *"영화 : Closer(드라마)"
  • default velue parameter을 사용할 때, 주의 해야 할 점은
    non-default value보다 앞에 선언하면 안 된다는 것 입니다.
    (Syntax error 발생)

Q. 왜 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 걸까요?

  • 파이썬은 기본적으로 전달 된 순서대로 값들을 변수에 할당합니다.
  • non-default value parameter이 먼저 배치되어 있다면 순서대로 전달된 인자값들을 parameter값으로 입력하면 될 것입니다.
  • 하지만 값의 입력을 생략해도, 기본값으로 저장된 인자값이 전달되는 default-value parameter가 non-default value parameter의 앞에 있다면 파이썬은 전달되는 인자값을 순서에 맞게 default-value parameter -> non-default value parameter에 할당합니다.
  • 그렇다면 default value pararmeter을 사용하는 이유가 없어지게 됩니다. 따라서 함수에서 parameter을 선언할 대에는 아래의 순서를 지켜야 합니다.

parameter 선언순서
1. 기본 매개변수(non-default)
2. 기본값이 정해진 기본 매개변수
3. 가변 매개변수(*args)
4. 키워드 매개변수
4. 가변 키워드 인수(**kwargs)

  • 이 순서를 지키지 않으면 파이썬은 애러 메시지를 리턴합니다.

1. 가변인자(*args)의 위치를 positional 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", 20)

'''
TypeError발생 :
가변인자는 인자의 갯수가 정해져있지 않기 때문에 
이어지는 모든 인자를 가변인자의 인자값으로 저장하므로
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" )

''' 
순서에 맞게 parameter를 배치하면
name=정우성
args=('01012341234', 'seoul')
age=20 
위와같이 정상적으로 출력된다.
''' 

2. 키워드 가변인자(**kwargs)의 위치를 positional argument 보다 앞에 놓으면?

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

## SyntaxError발생
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")
''' 
순서에 맞게 parameter를 배치하면
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
위와같이 정상적으로 출력된다.
''' 

3. 위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치에 따른 애러

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

## SyntaxError발생  
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")
''' 
순서에 맞게 parameter를 배치하면
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
위와같이 정상적으로 출력된다.
''' 

참고
파이썬 문법에서의 매개변수, 인자란 무엇인가
Python SyntaxError: non-default argument follows default argument Solution

좋은 웹페이지 즐겨찾기