python 함수에서 default value parameter의 사용

whybein·2020년 1월 29일
3

Python

목록 보기
1/7
post-thumbnail
post-custom-banner

위코드 6기 day2 2020.01.29

파이썬에서 함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유에 대해 정리해보겠습니다.

1. parameter arguments

파이썬 함수에서 parameter가 여러 개일 경우 순서가 바뀔 수도 있는데 그 때 parameter와 함께 값을 입력하면 순서와 상관없이 함수를 사용할 수 있습니다.

  • 함수 정의(2개 parameter)
#함수 정의
def hello(your_name, my_name):
  print(f"Hello, {your_name}. I'm {my_name}.")
  • positional arguments
#값만 입력할 경우 입력 순서에 따라 변수에 지정됩니다.
>>> hello("톰", "제리")
Hello,. I'm 제리.
  • keyword arguments
#parameter와 함께 값을 입력하면 순서와 상괍없이 원하는 결과를 출력합니다.
>>> hello(my_name = "제리", your_name="톰")
Hello,. I'm 제리.
  • Mixing(positional+keyword)
#parameter를 일부만 입력하려면 순서는 지켜야 합니다.
>>> hello("톰", my_name="제리")
Hello,. I'm 제리.

여기서 my_name은 default value parameter이고 your_name은 non-default value parameter입니다. 변수명을 같이 입력하지 않으면 기본적으로 non-default value parameter라고 볼 수 있습니다.
- Mixing error

#Mixing해서 사용하려면 순서를 지켜야 합니다.
>>> hello(my_name="제리", "톰")
SyntaxError: positional argument follows keyword argument

2. Parameter Default Value

#parameter에 default 값을 정할 수 있습니다.
def hello(your_name, my_name = "제리"):
  	print(f"Hello, {your_name}. I'm {my_name}.")
#default parameter가 있어 1개 parameter만 입력할 수 있으며 non-default인 your_name으로 인식합니다.
>>> hello("톰")
Hello,. I'm 제리.
- Error
default value parameter가 non-default value prameter보다 먼저 오면 오류가 납니다.
def hello(your_name = "톰", my_name):
  		print(f"Hello, {your_name}. I'm {my_name}.")
SyntaxError: non-default argument follows default argument
  • Parameter Default Value - parameter * 3 예시
#함수 정의
def hello(your_name, my_name, ntm):
  		print(f"Hello, {your_name}. I'm {my_name}. {ntm}.")
>>> hello("톰", "제리", "반가워")
Hello,. I'm 제리. 반가워.
- default 적용
def hello(your_name, my_name, ntm = "반가워"):
  		print(f"Hello, {your_name}. I'm {my_name}. {ntm}.")
def hello(your_name, my_name = "제리", ntm = "반가워"):
  		print(f"Hello, {your_name}. I'm {my_name}. {ntm}.")

오류

def hello(your_name, my_name = "제리", ntm):
  		print(f"Hello, {your_name}. I'm {my_name}. {ntm}.")
SyntaxError: non-default argument follows default argument
def hello(your_name = "톰", my_name, ntm):
  		print(f"Hello, {your_name}. I'm {my_name}. {ntm}.")
SyntaxError: non-default argument follows default argument

3. 왜 안될까

default value parameter가 있으면 실제 parameter의 개수보다 적은 parameter를 입력하게 됩니다. 이 때 비어 있는 non-default value parameter에 값이 순서대로 입력되는데 어느 parameter가 non-default인지 추가적인 계산을 해야하기 때문이지 않을까 합니다. 따라서 default value parameter는 가장 끝에 위치하고 non-default value parameter를 처음부터 순차적으로 인식하는 구조로 되어 있는 방식으로 구동하게 만들었을 것 같습니다. 이렇게 고민해 본 후 웹에서 자료를 찾아봤습니다.


https://docs.python.org/3.7/glossary.html#term-argument
https://docs.python.org/3.7/glossary.html#term-parameter
https://docs.python.org/3.7/faq/programming.html#faq-argument-vs-parameter

https://stackoverflow.com/questions/16932825/why-cant-non-default-arguments-follow-default-arguments
2013년도 글이라 지금과 조금 다를 수 있지만 제가 생각한 맥락과 비슷해 보입니다. 이 글을 보고 non-default value parameter의 개수보다 적게 또는 많게 parameter입력을 하면 어떻게 되는지 궁금해졌습니다. 3개 parameter를 가진 함수를 다시 가져와 보겠습니다.

  • parameter 3개인 함수 정의 (non-default 2개 / default 1개)
def hello(your_name, my_name, ntm = "반가워"):
  		print(f"Hello, {your_name}. I'm {my_name}. {ntm}.")
- parameter 1개 입력
>>> hello("톰")
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    hello("톰")
TypeError: hello() missing 1 required positional argument: 'my_name'
- parameter 3개 입력
>>> hello("톰","제리","반갑다 친구야")
Hello,. I'm 제리. 반갑다 친구야.

4. 결론

  • 함수를 정의할 때 또는 arguments를 mixing할 때(postional+keyword) default value parameter는 항상 non-default value parameter 뒤에 있어야 한다.
  • 함수를 실행할 때 non-default parameter 개수 이상의 parameter 값을 입력해야 하며 초과해서 입력할 경우 default값이 아닌 입력값으로 인식한다.
profile
Back-End Developer
post-custom-banner

0개의 댓글