본문 바로가기
Python/Python Basic

17. Python - Python 함수의 입력값(인자) 수를 동적으로 정의하기

by Rosmary 2020. 3. 17.
728x90
반응형

 

 

앞선 포스팅에서, 함수가 무엇이며, 함수의 형태가 대략적으로 어떤 모양을 띄고 있는지 알아보았다. 함수는 입력값 입력, 이에 따른 연산 진행 및 출력값 반환이라는 3 단계의 프로세스를 가지는 것이 일반적이다.

 

이번 포스팅에서 설명할 내용은, 함수의 입력값에 해당하는 함수의 인자에 관한 이야기다. 앞의 포스팅에서도 예시로 든 것이지만, 덧셈을 실행하는 함수를 제작하려면, 당연히 2개 이상의 피연산값이 함수의 인자로 들어와야 한다. 따라서 덧셈을 진행하는 함수는 일반적으로 다음과 같은 형태를 띈다.

 

----------------------------------------------

def sum(a, b):

 

    return a + b

----------------------------------------------

(result = a + b로 반환할 결과값을 함수 내에 변수로 명시해 주어도 된다. 이 경우, return result로 코드가 마무리된다.)

 

곱셈이나 뺄셈 역시 마찬가지로, 함수명과 기호만 제외하면 동일한 형태의 함수 형태를 가진다(나눗셈은 0으로 나누는 연산이 들어갈 경우 에러가 발생한다. 이와 관련된 내용은 추후 예외처리를 다룰 때 다시 언급하려 한다).

 

그런데... 한 가지 고민이 생겼다. 위에서 만든 함수를 보면, 함수가 받아들일 수 있는 인자, 즉 입력값은 2개 뿐이다. 따라서, 입력값이 두 개인 sum() 함수는 다음과 같이 실행이 가능하지만,

 

 

입력값이 두 개를 초과하는 함수는 다음과 같이 에러가 발생하게 된다.

 

 

아래에 나타난 에러 메세지를 보면 그 이유가 명확하다. 가장 아랫줄을 보면

"TypeError: sum() takes 2 positional argument but 3 were given"

이라는 문구가 보이며 이 뜻은 다음과 같다.

 

"니들이 sum() 함수 만들면서 입력값은 2개로 한다고 정했으면서, 입력값을 3개나 주면 어떡하냐???"

 

즉, 정의된 내용을 벗어난 상황이 발생하여 컴퓨터가 해당 코드를 인지하지 못하는 것이다. 따라서, 해당 함수를 사용하기 위해서는 입력값이 하나여도 안되고, 2개를 초과해도 안되고 아예 없어도 안된다. 무조건 2개의 입력값이 존재해야 한다.

 

그런데, 연산이라는게 단지 두 개의 피연산값으로만 진행되는 것이 아니다보니.... 모든 상황을 고려하여 아래와 같이 함수를 무한정으로 만들수도 없는 노릇이다.

 

def sum1(a, b):  return a + b

def sum2(a, b, c) return a + b +c

def sum3(a, b, c, d) return a + b + c + d

......

 

그렇다면, 함수의 인자 숫자가 버라이어티하게 변하는 상황이라면, 함수 인자를 어떻게 정의해 주어야 할까?

 

 

1. *args, 인자

 

함수의 인자에 *args를 입력하면, 함수에서 사용할 수 있는 인자의 개수가 동적으로 정의된다(arg는 arguments의 줄임말로, '인자'를 의미한다). 이 * 표시는 C 와 같은 언어에서 주로 포인터로 사용되는 기호지만, 파이썬에서 함수 인자 내에 사용 시, 입력된 모든 값을 Tuple로 저장하겠다고 명시하는 기호다.

 

덧셈을 진행하기에 앞서, 간단한 예시를 들어보겠다. 바로 아래에 필자가 정의한 함수는 사용자가 함수 사용 시, 입력한 인자값을 고스란히 출력만 해주는 함수다.

 

----------------------------------------------

def print_arguments(*args):

 

    for argument in args:

 

         print(argument)

-----------------------------------------------

** args라는 인자명은 다른 것으로 바꾸어도 무방하다.

 

해당 함수를 정의하고 다음과 같이 함수 인자를 바꿔가며 호출하면,

 

 

이전에 보았던 TypeError가 발생하지 않는 것을 확인할 수 있다. 이제, 이 코드를 덧셈에 적용해보자.

 

 

다음과 같이, 여러 개의 인자가 들어가더라도 이상없이 함수가 작동함을 알 수 있다. 

 

참고로, *을 사용하여 받아들여진 인자가 Tuple인지를 확인하는 방법은 다음과 같다.

 

 

 

2. ** kwagrs, 키워드 인자

 

함수의 인자 위치에 별표 * 한 개 대신, 두 개를 사용하는 경우도 있는데, 이 때 입력되는 인자들의 값은 Dictionary 형태로 저장된다. 따라서, **kwagrs로 정의된 함수에 인자를 집어넣기 위해서는 반드시 key=value 형태로 함수를 호출해주어야 한다. 아래와 같이.

 

** Dictionary 객체의 하위 함수인 items()는 여기를 참조하자.

 

 

이와 같이, 특정 키와 매칭되는 값을 동시에 출력하고자 할 때, 그리고 입력되는 정보의 수가 정확하게 정의되지 않을 때 키워드 인자를 이용하면 된다. 

 

** 사실, 필자는 키워드 인자를 사용해서 함수를 만들어 본 기억이 전혀 없고, 정확히 어떤 목적으로 사용해야 효과를 극대화 할 수 있는지 알지 못한다. 인터넷을 조금 뒤져봐도 예시가 마땅치가 않아서인지... 필자가 혼자 코딩하다가 쓸만한 예시가 생긴다면, 추후 추가로 포스팅하겠다.

 


 

지금까지 함수에서 사용하는 인자 수가 명확하게 지정되지 않았을 때, 함수를 정의하는 방법에 대해 알아보았다. 일반적으로, 인자값만 받아들이기 위해서 인자 정의 시, 별 표시(*) 한 개로 인자들을 Tuple로 받는 방식을 많이 사용하나, Dictionary 형태로 인자를 받는 방법도 Python에서 제공한다(기억하고 있으면 언젠가 쓸 일이 올지도 모른다...)

 

다음 포스팅에서는 예외처리에 대해 이야기해보려 한다.

 

반응형

댓글