Python에서 함수를 정의할 때 인수의 개수가 정해지지 않은 경우가 종종 있습니다. 이럴 때 유용하게 사용되는 것이 바로 *args와 **kwargs입니다. 이 두 매개변수를 활용하면 함수가 임의의 개수의 인수를 받아들일 수 있어 코드의 유연성이 크게 향상됩니다.
*args란 무엇인가?
단일 별표(*) 형태의 *args는 함수에 키워드가 없는(non-keyworded) 가변 길이 인수 목록을 전달할 때 사용됩니다. 여기서 중요한 것은 별표(*) 기호이며, 관례적으로 붙이는 'args'라는 이름과 함께 '키워드가 없는 가변 길이 인수 목록'이라는 의미를 나타냅니다.
*args 사용 예제
다음은 *args를 활용해 전달받은 모든 숫자를 곱하는 함수의 예제입니다.
def multiply(*args):
y = 1
for i in args:
y = y * i
print(y)
multiply(3, 4)
multiply(10, 8)
multiply(2, 5, 6)
multiply(4, 5, 10, 9)실행 결과
12 80 60 1800
위 예제에서 볼 수 있듯이, multiply 함수는 호출 시 인수를 몇 개든 자유롭게 받을 수 있습니다. 전달된 인수들은 함수 내부에서 튜플(tuple) 형태로 묶여 처리됩니다.
**kwargs란 무엇인가?
이중 별표(**) 형태의 **kwargs는 함수에 키워드가 있는(keyworded) 가변 길이 인수 딕셔너리를 전달할 때 사용됩니다. 마찬가지로 두 개의 별표(**)가 핵심이며, 'kwargs'라는 이름과 함께 '키워드가 있는 가변 길이 인수 딕셔너리'라는 의미를 나타냅니다.
**kwargs 사용 예제
다음은 **kwargs를 활용해 키워드 인수를 그대로 출력하는 함수의 예제입니다.
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(a='foo', b=10, c=True)실행 결과
{'a': 'foo', 'b': 10, 'c': True}위 예제에서처럼 **kwargs를 사용하면 키워드 인수들이 함수 내부에서 딕셔너리(dictionary) 형태로 저장됩니다. 각 키워드는 딕셔너리의 키(key)가 되고, 해당 값(value)과 함께 저장됩니다.
*args와 **kwargs의 핵심 차이점
- *args: 위치 인수들을 튜플 형태로 받습니다.
- **kwargs: 키워드 인수들을 딕셔너리 형태로 받습니다.
- 두 매개변수를 함께 사용할 경우, 함수 정의에서 반드시
*args가**kwargs보다 앞에 위치해야 합니다.
이처럼 *args와 **kwargs를 잘 활용하면 다양한 상황에 대응할 수 있는 유연하고 재사용성 높은 함수를 작성할 수 있습니다.