Python 함수에서의 인수(arguments)는 함수를 호출할 때 전달하는 값을 말합니다.
함수 정의에서 지정한 파라미터를 통해 인수를 받을 수 있으며, 인수는 함수 내부에서 사용될 수 있습니다.
함수에서 인수는 직접적으로 전달할 수도 있고, 객체나 변수에 저장된 값을 전달할 수도 있습니다.
기본적으로, 위치 인수로서 함수의 인수는 파라미터의 순서대로 전달되지만, 키워드 인수로서 특정 파라미터에 값을 지정할 수도 있습니다.
이 글의 소스 샘플은 [Google Colab에서 Python 코드 실행하기] 글에서 언급한 환경을 이용하면 Python 프로그램을 PC에 설치하지 않더라도 Chrome, IE, Edge의 Browser에서 쉽게 Python프로그램을 실행하고 따라할 수 있습니다.
위치 인수
함수 호출시 인수를 전달하는 위치에 따라 모든 파라미터가 이 값을 받는지에 대한 여부가 결정되는 인수, 혹은 그 인수를 전달하는 방식을 위치 인수(positional argument)라고 부릅니다.
def fun1(p1, p2, p3):
return f'parameter1: {p1}, parameter2: {p2}, parameter3: {p3}'
print(fun1(1, 2, 3))
실행 결과는 다음과 같습니다.
parameter1: 1, parameter2: 2, parameter3: 3
함수 fun1의 인수 1, 2, 3은 함수에 정의된 return문의 파라미터인 ‘parameter1’, ‘parameter2’, ‘parameter3’으로 각각 전달됩니다.
키워드 인수
인수의 위치에 주의하면 문제 없이 인수를 함수에 전달할 수 있습니다. 그러나 경우에 따라서는 특정 값은 특정 파라미터에 할당한다고 지정해주어야 할 때도 있습니다. 이 때에는 ‘키워드 인수’를 사용합니다.
키워드 인수는 함수 호출 시에 실제 인수를 어떤 파라미터에 전달할 것인지를 ‘파라미터 명 = 실제 인수 값’으로 지정합니다. 함수를 정의할 때 파라미터 목록에 지정한 순서대로 인수를 전달할 필요는 없습니다.
def fun2(p1, p2, p3):
return f'parameter1: {p1}, parameter2: {p2}, parameter3: {p3}'
print(fun2(p3='a', p2=1, p1=10.57))
실행 결과는 다음과 같습니다.
parameter1: 10.57, parameter2: 1, parameter3: a
각각의 파라미터에 해당하는 값이 전달되는 것을 확인할 수 있습니다.
참고로, 함수의 파라미터 목록에 있는 파라미터 명과 키워드를 일치 시키는 것에 주의합니다. 파라미터 목록에 없는 키워드는 지정할 수 없습니다.
파라미터 목록에 없는 키워드를 지정하고 싶은 경우에는 ‘가변장 키워드 인수’를 사용할 수 있습니다. 가변장 키워드 인수에 대해서는 아래 글을 참조하세요.
위치 인수와 키워드 인수의 혼합
위치 인수와 키워드 인수를 함께 쓸 수도 있습니다. 함께 쓸 때에는 위치 인수를 먼저 지정하고 나서 키워드 인수를 지정합니다.
정상
def fun3(p1, p2, p3):
return f'parameter1: {p1}, parameter2: {p2}, parameter3: {p3}'
print(fun3(1, p3='keyword parameter3', p2=2))
실행 결과는 다음과 같습니다.
parameter1: 1, parameter2: 2, parameter3: keyword parameter3
에러
def fun3(p1, p2, p3):
return f'parameter1: {p1}, parameter2: {p2}, parameter3: {p3}'
print(fun3(1, p3='keyword parameter3', 2))
실행 결과는 다음과 같습니다. 키워드 인수는 항상 위치 인수 뒤에 전달해야하며, 위치 인수 앞에 전달하려는 경우 오류가 발생합니다.
File "<ipython-input-4-04c436e7e684>", line 1
print(myfunc(1, param3='param3', 2))
^
SyntaxError: positional argument follows keyword argument
인수 언패킹
위치 인수와 키워드 인수는 모두 반복 가능 객체(복수의 값을 가진 오브젝트)를 언패킹하여 전달할 수 있습니다.
위치 인수의 언패킹
위치 인수에 문자열 요소를 언패킹하기 위해 반복 가능 객체 앞에 ‘*’를 붙여줍니다.
def fun4(p1, p2, p3):
return f'parameter1: {p1}, parameter2: {p2}, parameter3: {p3}'
print(fun4(1, p3='keyword parameter3', 2))
print (fun4 (*'123'))
print (fun4 (1, *'bc'))
print (fun4 (*'12', 'a'))
실행 결과는 다음과 같습니다.
parameter1: 1, parameter2: 2, parameter3: 3
parameter1: 1, parameter2: b, parameter3: c
parameter1: 1, parameter2: 2, parameter3: a
각각의 오브젝트에 들어있는 값들이 개별적인 값으로 해체되어 각각의 파라미터에 순서대로 전달됩니다. 참고로, 패킹된 값의 개수는 함수의 파라미터 개수와 일치해야 합니다. (임의의 수의 인수를 파라미터로 받는 함수도 있습니다.)
위치 인수의 언패킹(개수가 부족한 경우)
def fun4(p1, p2, p3):
return f'parameter1: {p1}, parameter2: {p2}, parameter3: {p3}'
print(fun4(*'AB'))
*’AB’ 부분은 튜플 형태의 아규먼트를 풀어주는 기능인데, 튜플에 2개의 값이 들어 있습니다. 하지만 fun4 함수에서는 최소 3개의 아규먼트가 필요하기 때문에 아규먼트의 개수가 부족으로 다음과 같이 오류가 발생합니다.
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-ca0efcf95367> in <module>()
----> 1 print(fun4(*'AB'))
TypeError: fun4() missing 1 required positional argument: 'p3'
위치 인수의 언패킹(개수가 더 많은 경우)
def fun4(p1, p2, p3):
return f'parameter1: {p1}, parameter2: {p2}, parameter3: {p3}'
print(fun4(*'ABCD'))
주어진 파이썬 함수 fun4은 3개의 위치 인수를 기대하지만, 함수 호출시 fun4(*’ABCD’)의 경우에는 4개의 위치 인수를 제공하고 있습니다. 이는 위치 인수 개수가 fun4의 선언된 인수 개수와 다르기 때문에 다음과 같이 오류가 발생합니다.
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-9e5ef9f349f2> in <module>()
----> 1 print(fun4(*'ABCD'))
TypeError: fun4() takes 3 positional arguments but 4 were given
키워드 인수의 언패킹
위치 인수와는 달리, 키워드 인수는 단순히 문자열을 언팩하는 것만으로는 값을 전달할 수 없습니다. ‘파라미터 명 = 실제 인수 값’이라는 형식으로 기술하기 위해서는 사전 등을 기능을 사용해야 합니다.
ex_dict = {'key1':1, 'key2':'2'}
키와 값의 조합은 ‘키 : 값’과 같이 기술하고 여러 조합이 사전에 포함된 경우, 이를 쉼표로 구분하여 중괄호 ‘{}’안에 순서대로 정의합니다.
dict_ex = {'p3':5, 'p2':10.01, 'p1':'parameter1'}
사전에 저장되어 있는 ‘키와 값’ 조합은 키에 fun4 함수의 파라미터 목록에 있는 파라미터 명이 사용되었는지를 신경써서 기술합니다. 사전을 언팩하여 fun4 함수에 전달하려면 사전 명 앞에 ‘**’를 붙여서 함수의 인수로 지정합니다.
print(fun4(**dict_ex))
실행 결과는 다음과 같습니다.
parameter1: parameter1, parameter2: 10.01, parameter3: 5
사전을 언팩하여 그 사전에 포함되어있는 키가 일치하는 파라미터를 찾아 값을 전달하는 것을 확인할 수 있습니다.