Dev/Python

[Python 기초] Function Parameter & Arguments

sincerely10 2020. 6. 24. 22:08
반응형

안녕하세요. Pytho에 기초 가운데 Funtion Parameter의 종류와 에러가 발생하는 케이스를 관찰 해보도록 하겠습니다.
시작하기 전에 함수에 들어가는 input 형태를 parameter나 argumeter라고 하는데 이를 확인하고 가겠습니다.

목차는 다음과 같습니다.

1. Parameter Vs Argument
2. Keyword Arguments
3. Positional Arguments와 Keyword Arguments의 혼용
4. 함수의 parameter -> default value & non default value

1. Parameter Vs Argument

간단하게 정리하면 Parameter는 함수가 받는 변수를, Argument는 함수에 실제로 들어가는 Input Value 입니다.
한글로 번역하면 Parameter는 매개변수, Argument는 인자라고 할 수 있습니다.

간단하게 예시를 확인하면 다음과 같습니다.
parameter는 정의한대로 함수가 받는 변수를 의미합니다.
즉, num1, num2가 multiply 함수의 Parameter 입니다.

그리고 Argument는 함수가 실제적으로 사용하는 값입니다.
여기서 3과 6이 argument 입니다.

# Parameter
def multiply(num1, num2):
	return num1*num2

# Argument
multiply(3,6)

 

2. Keyword Arguments

간단한 함수를 사용할 때, 순서대로 parameter에 값을 입력 해주지만,
입력하는 Argument의 순서를 바꿀 수도 있습니다.

순서대신 Parameter 이름으로 Argument를 작성할 수 있는데, 이를 keyword arguments 라고 합니다.

# Parameter
def today(year, month, day):
	print(f"오늘은 {year}년 {month}월 {day}일 입니다.")

>>> today(day=24,year=2020,month=6)
오늘은 2020년 6월 24일 입니다.

이렇게 년월일의 순서가 뒤죽박죽이지만, 정상적으로 출력된 것을 확인할 수 있습니다.
반대로 keyword argument를 지정하지 않고 자리에 의해 parameter가 받아진 것을 Positional Argument 라고 합니다.

그리고 실제 python에서 사용하듯이 keyword arguments를 줄여서 kwargs라고 표현하겠습니다.

kwargs를 사용하면 어떤 장점이 있을까요?
우선 개발한 프로그램의 안정성이 올라갑니다. 변수명을 기입함으로서, 엉뚱한 변수를 기입할일이 줄어듭니다.
또한, 가독성이 좋아집니다. 함수명에 변수명을 보면 이 함수가 어떤 역할을 하는지 더욱 와닿을 것 입니다.

3. Positional Arguments와 Keyword Arguments의 혼용

kwargs와 positional argument를 혼용해서 사용하고 싶습니다.
년도와 월은 바꿔서 kwargs로 일자는 positional argument로 입력 해보겠습니다.

>>> today(month=6, year=2020, 24)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

에러가 납니다..!

kwargs가 positional argument 보다 먼저 선언 되어서 에러가 발생하였습니다.
이런 상황을 피하려면 positional arguments -> kwargs 순서로 작성해주셔야 합니다.
이 순서를 지켜서 작성 해보겠습니다.

>>> today(2020,day=24,month=6)
오늘은 2020년 6월 24일 입니다.

함수가 정상적으로 실행 되었습니다.

4. 함수의 parameter -> default value & non default value

2, 3번은 함수를 사용할 때의 입력인 Argument에 대한 내용이었습니다.
kwargs와 같이 미리 지정할 수 있다는 것을 확인하였습니다.

마찬가지로 함수의 선언부분에서도 parameter를 미리 선언할 수 있습니다.

def today(year, month, day=24):
	print(f"오늘은 {year}년 {month}월 {day}일 입니다.")

>>> today(month=6, year=2020)
오늘은 2020년 6월 24일 입니다.

선언할 때 부터 일자를 지정하니 함수의 입력에 일자가 없어도 정상 출력이 됩니다.

그런데 왜 일자부터 고정을 했을까요?
사실 에러가 떴기 때문입니다.

>>> def today(year=2020, month, day):
	print(f"오늘은 {year}년 {month}월 {day}일 입니다.")
     
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

원인은 default argument가 non-default argument보다 앞에 있기 때문입니다.

왜 non-default-value argument 앞에 default-value argument가 있으면 안 될까요?
거꾸로 생각 해보겠습니다.
만약, year를 먼저 쓸 수 있다면요.
함수를 사용할 때, 다음과 같은 상황이 벌어집니다.

def today(year=2020, month, day=24):
	print(f"오늘은 {year}년 {month}월 {day}일 입니다.")

today(2019,21)

두 개의 인수만 다음과 같이 사용하면, year가 2020으로 하고 싶은건지 2019로 하고 싶은건지 알 수 없습니다.
즉, 세 개의 변수 중 어떤 두개를 사용한다는 것인지 알 수 없습니다.

여기까지가 Function Parameter & Arguments에 대한 관찰이었습니다.
이어지는 Post에서는 변수 길이를 조절할 수 있는
Lengthable Arguments가변 인수 *args와 **kwargs 사용과 순서에 대해 학습 해보겠습니다.

반응형