Python

[python][basic]함수 인자 이해하기 (매개변수, 가변 인자 *args, **kwargs)

함수 인자란? 

인자(Argument) : 전달인자. 함수에서 받는 값중 실제로 값을 가지고 오는 input의 값

블로그를 보다보면 인자와 매개변수에 대해 정리한 글들이 많다. 인자와 매개변수의 차이가 무엇인지 명확하게 아는 것은 중요하다. 그 차이에 집중해서 다시 정의하자면 아래와 같이 이해할 수 있다. 코드로 보면 이해가 더 쉽다.

인자( Argument ) 는 어떤 함수를 호출시에 전달되는 값을 말하고
매개 변수( Parameter ) 는 그 전달된 인자를 받아들이는 변수다.

아래 코드에서 매개변수는 t1, t2이고, 인자는 함수호출시에 전달하는 'hello', 'python'가 될 것이다.

def add_txt(t1, t2='파이썬'): 
    print(t1+" : "+t2)
    
add_txt('hello','python')

함수에 값을 전달하는 방법 

함수에 값을 전달하는 방법은 여러가지가 있다. 위처럼 파라미터(키워드)이름을 지정해서 값을 넘기는 방식이 있는데, 이런 경우 인자의 순서는 무시해도 된다. 그말은 즉슨 add_txt(t2='hi', t1='python')으로 넘겨도 정상작동을 한다는 이야기!

그리고 위처럼, t2='파이썬'으로 인자에 기본값을 대입했다. 이렇게 기본값을 지정할 경우, 함수를 호출할 때 t2에 값을 따로 넘겨주지 않을 경우 기본값을 사용하게 됨을 의미한다. 주의해야 할 점은 함수를 정의하며 인자에 기본값을 대입하는 경우에는 이 기본값을 대입한 인자는 마지막에 위치해야 한다. 만약 기본 인자의 위치를 일반 인자 앞에 두면 오류가 발생한다. (아래 이미지 참고)


* agrs

종종 마주치는 키워드 * args 키워드는 arguments의 약자이다. 입력을 받고 싶은데 사용자가 몇개의 인자를 넘기는지를 정해두지 않고 사용자가 입력하고 싶은 인자들을 모두 받고자 할 때 사용한다. 예를 들어서, 우리는 사용자에게 오늘 총 구입한 물건 값의 총 합을 구해주는 함수를 작성하고자 하는데, 사용자에 따라 오늘 구입한 물품의 개수는 모두 다를 것이다. 이럴 때 사용자가 구입한 물건의 값을 받는 인자의 개수를 자유롭게 두어야 하는데 이런 상황에 우리는 *args를 사용하는 것이다.  가변 인자라고 생각하면 되는데 사실 인자 이름은 무조건 args여야할 필요없고 자유롭게 사용가능하다. 앞에 *만 붙여주는 되는 것!  *var로 사용해도 무관하다는 이야기! *args는 함수 내부에서 튜플로 처리된다.

튜플로 처리되기 때문에 아래처럼 튜플 안 요소를 아래와 같이 자유롭게 사용할 수 있다.


** kwargs

* args에 대해 이해를 했다면 **kwargs도 이해하기 쉽다. 위 상황에서 인자의 키워드 함께 대입할 때 사용하는 것이다. 다시 말해 * args와 ** kwargs 는 모두 사용자가 몇개의 인자를 입력할 지 모르는 상황에서 입력하는 모든 인자들을 수용하기 위해서 사용하는 것이다. 둘의 차이점은 인자의 이름을 지정할지 안할지에 있다. * args는 nonkeyword, **kwargs는 keyword. 그렇다면 위의 잠깐 들었던 오늘의 가계부 입력 함수는 kwargs를 활용해 사용자의 입력을 인자로 받아 이제 사용자가 물건의 값 뿐만 아니라, 물건의 품목과 가격을 함께 입력해줄 수 있는 것이다.

kwargs는 함수 내부에서 사전으로 처리하기 때문에 입력한 keyword를 사용할 수 있다.