Computer Language/Python

함수의 가변인자 *(Asterisk)의 의미

rajent 2020. 11. 28. 16:53
728x90

python에서 *하나붙은 argument는 함수 호출 시 argument의 개수를 가변적으로 입력할 수 있습니다.

def test(\*arg):  
    for data in arg:  
        print(data)

이렇게 함수를 선언하고 아래와 같이 두가지 형태로 함수를 호출해봅시다.

test(1,2,3)
test( (1,2), (1,2), (2,1), (2,2) )

결과는 아래와 같이 가변변수 값으로 그대로 출력됩니다.

>>> test(1,2,3)
1
2
3
>>> test( (1,2), (1,2), (2,1), (2,2) )
(1, 2)
(1, 2)
(2, 1)
(2, 2)

**karg는 어떻게 다를까?

*이 두개 붙은 키형 가변변수는 보통 key와 값으로 선언됩니다.

def test2(\*\*karg):  
    for key, value in karg.items():  
        print('key : %s, value : %s' % (key, value))

함수를 호출할때는 아래와 같이 key=value 형식으로 argument를 넣어줍니다.
test2(a=1, b=2)

어라? 어디서 많이 본듯한 유형인데..

바로 dict랑 구조가 비슷합니다. 다양한 형태의 dict자료형을 함수내에서 template화해서 처리 가능할 것 같습니다.
test해봅시다. dictionary 자료형을 두가지 형태로 만듭니다.

data1 = {
'a':1,
'b':2,
'c':3
}

data2 = {
'a':1,
'b':(1,2),
'c':{ 'sub1':1, 'sub2':2 }
}

함수를 호출할때는 앞에 **를 꼭 붙여줘야 합니다.

>>> test2(**data1)
key : a, value : 1
key : b, value : 2
key : c, value : 3

>>> test2(**data2)
key : a, value : 1
key : b, value : (1, 2)
key : c, value : {'sub1': 1, 'sub2': 2}

두번째 유형이 어디서 많이 본거죠? 네 맞습니다. json형태입니다.
json형태의 data를 다룰때 가변변수를 사용해서 template화 된 함수를 구현할 수 있습니다.

참고로 Key형 가변변수는 Pyhon3에서만 지원합니다.