조금씩 꾸준히 완성을 향해

[Python] *args / **kwargs 본문

Python/문법

[Python] *args / **kwargs

all_sound 2022. 8. 31. 22:47


함수를 효과적으로 사용하기 위해서는 *args 와 **kwargs의 특징과 차이점을 잘 알아야 한다.

▶ *args


개수와 상관없이 전체 인자 값을 다 가져올 때 사용한다.
앞에 *만 붙인다면 무슨 문자를 써도 상관없지만, 통상적으로는 arguments의 약자인 args를 많이 쓰인다.

형태는 tuple로 가져오기 때문에 tuple에서 사용할 수 있는 기능들을 모두 사용할 수 있다.

def get_avg(*args):
    sum = 0
    for a in args:
        sum += a
        avg = sum / len(args)
    return avg
    
print(get_avg(80, 90, 100))  #90.0
print(get_avg(75, 80, 94, 78))  #81.75
print(get_avg(80, 73, 76, 86, 82))  #79.4

여기서는 인자로 모든 점수들을 다 받아서 평균을 구하는 함수를 구현했다.

 

def two_choice(word, *args):
    if word == "arithmetic" :
        total = sum(args)
    else:
        total = 1
        for a in args:
            total *= a
    return total

x = two_choice("arithmetic", 1,2,3)
print(x) # 6
y = two_choice("multiplication", 1,2,3,4,5)
print(y) # 120

이렇게 다른 형태의 인자와도 함께 사용할 수 있다.
함수에서 파라미터를 받을 때는 순서대로 매칭하기 때문에
호출할 때 보낸 첫번째 문자열("arithmetic" / "multiplication")이 word로 들어가게 되고, 나머지 숫자들이 한꺼번에 *args로 들어가게 된다.


**kwargs


dictionary 형태로 인자 값을 받아 올 때 사용한다.
앞에 **만 붙인다면 다른 문자로 값을 지정할 수도 있지만 통상적으로는 **kwargs로 많이 쓰인다.
인자로 넣을 때 기본 형태는 key = value 이다.

def intro(**kwargs):
    print('Data type of argument:', type(kwargs))
    for key, value in kwargs.items():
        print(f'{key} is {value}')
intro(Firstname='Dave', Lastname='Karim', Age=32, Phone='01034567890')

'''
Data type of argument: <class 'dict'>
Firstname is Dave
Lastname is Karim
Age is 32
Phone is 01034567890
'''

호출하면서 보낸 여러 데이터가 함수 안으로 들어가면 key : value 형태로 dictionary 안에 저장된다.
따라서 dictionary에서 사용할 수 있는 여러 기능들을 함수 안에서 자유롭게 사용할 수 있다.


만약 dictioanry 자체를 파라미터로 넘기려면 변수 이름 앞에 **를 붙여줘야 한다.

dic = {"a" : 1, "b" : 2, "c" : 3, "d" : 4}
def func(**kwargs):
    print(kwargs)
 
func(**dic)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}



세가지 인자의 형태를 함께 출력해 보았다.
여기서 첫번째 인자는 필수값이라 넣어주지 않으면 에러가 뜬다.
나머지 값들은 없으면 빈 공간으로 출력되는 것을 볼 수 있다.

def f(a, *args, **kwargs):
    return a, args, kwargs

print(f('no'))
print(f('no', 5, 10, 15))
print(f('no', 5, 10, 15, b=1))
print(f('no', 5, 10, 15, b=1, c=2))

'''
('no', (), {})
('no', (5, 10, 15), {})
('no', (5, 10, 15), {'b': 1})
('no', (5, 10, 15), {'b': 1, 'c': 2})
'''


잘 익혀 놓으면 여러가지 복합적인 데이터를 다룰 때 유용하게 쓸 수 있을 것 같다.