* 와 ** 는 언패킹/패킹 연산자이다.

함수 정의 시 사용

파이썬 함수 호출에는 두 종류가 있다.

  1. positional arguments
  2. keyword arguments

여기서 개수가 가변적인 인자들을 갖는 함수를 정의할때 다음을 사용한다.

*args

(positional) arguments로 인자들을 튜플로 묶는다.

def f(*args):
    print(args)
 
f(1, 2, 3)
>> (1, 2, 3)

→ args는 tuple

**kwargs

keward arguments로 키워드 인자들을 딕셔너리로 묶는다. key=value 형태만 받는다.

def f(**kwargs):
    pring(kwargs)
 
f(a=1, b=2)
>> {'a': 1, 'b': 2}

→ kwargs는 dict

함수 호출 시 사용

* 리스트/튜플 언패킹

def f(a, b, c):
    print(a, b, c)
 
lst = [1, 2, 3]
f(lst)   # 패킹된 채로 들어가 하나의 인자로 간주, 에러 발생
>> TypeError: f() missing 2 required positional argument: 'b', 'c'
 
f(*lst)  # 언패킹
>> 1 2 3

** 딕셔너리 언패킹

def f(a, b):
    print(a, b)
 
d = {'a': 1, 'b': 2}
f(**d)   # f(a=1, b=2)와 동일