파이썬에서 함수를 정의할 때 매개변수 앞에 붙는 *(별표)는 단순한 기호가 아니라, 함수가 임의 개수의 인수를 유연하게 받을 수 있도록 해주는 강력한 문법입니다. 별표 하나(*)와 두 개(**)는 각각 다른 용도로 사용되며, 이를 제대로 이해하면 훨씬 유연하고 재사용성 높은 함수를 작성할 수 있습니다.
1. *(단일 별표): 가변 위치 인수(*args) 받기
매개변수 앞에 별표 하나(*)를 붙이면, 함수를 호출하는 쪽에서 전달하는 임의 개수의 위치 인수(positional arguments)를 튜플(tuple) 형태로 한꺼번에 받을 수 있습니다.
>>> def function(*arg): ... for i in arg: ... print(i) >>> function(1, 2, 3, 4, 5) 1 2 3 4 5
위 예제처럼 호출 시 인수를 몇 개든 전달해도 모두 하나의 튜플 arg에 담겨 처리됩니다. 관례상 이 매개변수의 이름은 *args로 작성하는 것이 일반적입니다.
2. **(이중 별표): 가변 키워드 인수(**kwargs) 받기
매개변수 앞에 별표 두 개(**)를 붙이면, 함수 호출 시 키=값 형태로 전달되는 임의 개수의 키워드 인수(keyword arguments)를 딕셔너리(dictionary) 형태로 받습니다.
>>> def function(**arg): ... for i in arg: ... print(i, arg[i]) >>> function(a=1, b=2, c=3, d=4) a 1 b 2 c 3 d 4
이 경우 arg는 {'a': 1, 'b': 2, 'c': 3, 'd': 4}와 같은 딕셔너리가 되며, 마찬가지로 관례상 매개변수 이름은 **kwargs로 작성합니다.
3. 대입문에서의 확장 언패킹 (Python 3)
파이썬 3부터는 대입문의 변수에 별표를 붙여 이터러블(iterable)의 확장 언패킹(extended unpacking)을 수행할 수 있습니다. 별표가 붙은 변수에는 나머지 값들이 리스트(list)로 할당됩니다.
>>> a, *b = [1, 2, 3, 4] >>> a 1 >>> b [2, 3, 4] >>> a, *b, c = [1, 2, 3, 4] >>> a 1 >>> b [2, 3] >>> c 4
두 번째 예제처럼 별표 변수가 중간에 위치하면, 첫 번째 값과 마지막 값을 제외한 나머지 요소들이 리스트로 수집됩니다.
핵심 정리
- *: 함수 정의 시 가변 개수의 위치 인수를 튜플로 수집합니다.
- **: 함수 정의 시 가변 개수의 키워드 인수를 딕셔너리로 수집합니다.
- 대입문의 *: 이터러블 언패킹 시 나머지 요소를 리스트로 수집합니다.
이 세 가지 문법을 적절히 조합하면 호출 방식에 유연하게 대응하는 범용 함수를 손쉽게 구현할 수 있습니다.