파이썬에서 함수를 정의하는 목적은 함수의 인자에 서로 다른 값을 전달하면서 코드를 반복적으로 실행하기 위함입니다. 그런데 이런 설계에는 한 가지 고민이 따릅니다. 바로 "함수를 호출할 때마다 처리해야 할 인자의 개수가 달라진다면 어떻게 해야 할까?"라는 문제입니다. 이때 필요한 것이 바로 *args와 **kwargs라는 특별한 인자입니다. 지금부터 하나씩 자세히 살펴보겠습니다.
*args – 가변 개수의 위치 인자
*args를 사용하면 함수에 임의 개수의 위치 인자(positional argument)를 전달할 수 있습니다. 아래 예제는 여러 숫자를 곱한 결과를 구하는 코드입니다. 함수를 호출할 때마다 숫자의 개수가 달라져도 하나의 함수로 유연하게 처리할 수 있습니다.
예제
def findproduct(*many_nums):
result = 1
for num in many_nums:
result = result * num
print("Multiplication result:", result)
findproduct(3, 9)
findproduct(2, 11, 10)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Multiplication result: 27 Multiplication result: 220
**kwargs – 가변 개수의 키워드 인자
다음으로, 키-값(key-value) 쌍 형태의 키워드 인자(keyword argument)를 함수에 전달해야 하는 경우를 생각해 볼 수 있습니다. 이때도 마찬가지로 키워드 인자의 개수를 자유롭게 조절할 수 있는데, 이렇게 선언되는 인자를 **kwargs라고 부릅니다. 주의할 점은 일반 *args와 달리 별표(asterisk) 두 개를 붙인다는 것입니다. 실제로 **kwargs로 전달된 값들은 여러 개의 키-값 쌍을 담고 있는 파이썬 딕셔너리(dictionary) 형태로 함수 내부에 전달됩니다.
예제
def country_details(**state_info):
print('\n\n')
for k, v in state_info.items():
print("{} is {}".format(k, v))
country_details(StateName="Telangana", Capital="Hyderabad", Population=3400000)
country_details(StateName="Andhra Pradesh", Capital="Amaravati", Population=1000000, ForestCoverage="30%")
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
StateName is Telangana Capital is Hyderabad Population is 3400000 StateName is Andhra Pradesh Capital is Amaravati Population is 1000000 ForestCoverage is 30%
정리
*args는 개수가 정해지지 않은 위치 인자를 튜플(tuple) 형태로 받아들이고, **kwargs는 개수가 정해지지 않은 키워드 인자를 딕셔너리 형태로 받아들입니다. 두 기능을 적절히 활용하면 호출 상황에 따라 유연하게 인자를 전달할 수 있는 범용적인 함수를 작성할 수 있으며, 라이브러리나 프레임워크 개발에서도 폭넓게 사용되는 필수 개념입니다.