[Python] default parameter와 non-default parameter (함수의 매개변수 1편)

이태권 (Taekwon Lee)·2022년 5월 28일
0

[Python]

목록 보기
1/5

📝 들어가기 전에

argument와 parameter는 다르다?

해당 자료를 조사하는데 argument와 parameter가 여기저기 적혀 있어서 너무 혼란스러웠다. 그래서 이것부터 정리하고 넘어가자. 쉽게 말하면 parameter(매개변수)는 변수 이름이고 argument(전달인자, 인자)는 값이므로 서로 다르다.

Python의 특징? 다양한 매개변수!

  • 파이썬의 함수는 다른 언어와 다르게 여러 종류의 매개변수를 받을 수 있다.
  • 매개변수가 기본값의 유무가 있는지에 따라 default value parameternon-default value parameter 나뉘며
  • 이 매개변수를 여러 개의 인자로 받을 수 있는 *args**kwargs로 나뉜다.

위치 인자와 가변 인자

  1. 위치 인자(positional arguments): 함수 호출 시 전달되는 값이 매개변수에 순서대로 전달되는 인자. 가장 일반적으로 사용하는 argument다.
def print_num(a, b, c):
	print(a, b, c)
print_num(2022, 5, 28)	# 2022 5 28
# 이처럼 2022, 5, 28이 순서대로 a, b c에 전달되었다.
  1. 가변 인자(variable length arguments): 개수가 변할 수 있는 인자, 즉 함수 호출 시 인자의 개수를 다양하게 바꾸며 전달할 수 있다.
def print_num(*args):
    for i in args:
        print(i)
        
print_num() 				# 아무 것도 안 나온다
print_num(2022) 			# 2022
print_num(2022, 5)			# 2022 5
print_num(2022, 5, 28)		# 2022 5 28




정의

default value parameter

  • 함수를 선언할 때 미리 값이 정해지게 되는 매개변수이다.
  • 기본 값이 이미 존재하는 매개변수를 받을 때 사용하고
  • 언제든지 함수를 사용할 때 값을 변경 할 수 있다.
  • 변경 가능하기에, default는 non-default보다 뒤에 위치해야 한다.
  • 코드의 중복을 줄여 가독성을 높일 수 있다.
def print_def_val_param(count, last="boom!"):
    for i in range(count, 0, -1):
        print(i)
    print(last)
    
print_def_val_param(5)
5
4
3
2
1
boom!

값의 변경도 가능하다

def print_def_val_param(count, last="boom!"):
    for i in range(count, 0, -1):
        print(i)
    print(last)
    
print_def_val_param(5, "half of 1")
5
4
3
2
1
half of 1"

non-default value parameter

  • 함수를 선언할 때 미리 값이 정해져 있지 않은 매개변수이다.
  • 제일 흔히 쓰이는 종류의 매개변수이다.
  • 함수 호출 시, 매개변수의 순서대로 인자를 넣어주어야 한다.

몇몇 단점이 존재한다.
1. 논리적 오류를 발생시킬 수 있다.
2. 인자에 어떤 타입이 들어오는지 몰라 가독성이 떨어진다.

def print_non_def_val_param(name, hobby):
	return f"I am {name} and I like {hobby}"

# 1. 순서대로 잘 기입하면 문제 없다.
print(print_non_def_val_param("taekwon", "to drink tea"))

# 2. 순서가 틀리면 의도치 않은 오류를 발생시킬 수 있다.
print(print_non_def_val_param("to drink tea", "taekwon"))
I am taekwon and I like tea
I am to drink tea and I like taekwon




문제

Q. 함수 정의 시 default value parameter를 non-default value parameter 앞에 정의하면 왜 안 될까?

우선 잠시 default value parameter를 default로, non-default value parameter는 non-default로 줄여서 말해 보자.

  1. 파이썬의 문법 상 일단 그렇게 정해져 있다.
  2. 왜 그럴까? 두 가지가 순서 없이 뒤섞여 있을 경우, 함수 호출 시 interpreter가 어떤 값이 argument를 가리키는지 찾지 못하기 때문이다.
  3. 위치 인수가 parameter에 할당되면 '→' 순서의 방향성이 존재한다.
  4. 예를 들어, default를 non-default 앞에 정의하여 argument를 1개만 전달할 경우
  5. 해당 argument는 default에만 할당되므로 non-default에는 할당 받는 값이 없어
  6. 오류가 발생한다.
def love_you(my_name = "정우성", your_name): 
    print(f"{my_name} loves {your_name}") 

love_you("아이유")
> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument



참고 자료

profile
(Backend Dev.) One step at a time

0개의 댓글