*args 와 **kwargs 에 대하여 직접 테스트를 하며 이해를 해 보겠습니다.

일반적인 접근과는 조금은 다른 접근을 해서 이해해 보려 합니다.

1. *args

1) args는 arguments의 줄임말입니다.

2) args대신에 어떠한 영어를 넣어도 상관없으며 통상적으로 args로 사용하기 때문에 사용해 줍니다.

3) 앞에 붙은 *(아스테리크, asterik)를 붙이면 인식이 됩니다.

4) 인자의 개수에 상관없이 인자들을 싸잡아 묶을 때 사용합니다.

 

아주 기본적인 예시를 알아봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
li = [12345]
a, b, *args = li
print(a)
print(b)
print(args)
 
'''
결과
1
2
[3, 4, 5]
'''
cs

 

*를 인자 앞에 붙이면 알아서 필요한 인자들을 묶어 리스트로 보여줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
li = [12345]
a, *args, b = li
print(a)
print(b)
print(args)
 
'''
결과
1
5
[2, 3, 4]
'''
cs

조금 응용해보면 예상한 결과가 나옵니다.

 

보통은 함수를 예시로 많이 나옵니다만 굳이 함수까지 언급하지 않아도 위를 기억하면 응용 가능합니다.

하지만 바로 위의 예시처럼 함수의 인자로 사용해보면 어떨지 실험해 보았습니다.

1
2
3
4
5
6
7
8
9
10
# 함수에 들어가는 인자들의 맨 앞과 맨 끝의 수만 더하기
def func(a, *args, b):
    return a + b
 
print(func(1,2,3,4,5,6))
 
'''
결과
TypeError: func() missing 1 required keyword-only argument: 'b'
'''
cs

*args는 a 다음의 모든 인자들을 받기 때문에 b에 대한 인자가 들어있지 않다고 나옵니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
# 함수에 들어가는 인자들의 맨 앞과 맨 끝의 수만 더하기
def func(a, *args):
    print(args)
    return a + args[-1]
 
print(func(1,2,3,4,5,6))
 
'''
결과
(2, 3, 4, 5, 6)
7
'''
cs

args의 경우 튜플로 결과가 나옵니다. 그리고 위와 같이 args에 [-1]을 붙여 마지막 인자값을 구할 수 있습니다.

 

2. **kwargs

1) *args와 마찬가지로 kwarg는 어떠한 영어로 써도 상관없지만 따르도록 합니다.

2) ** 이중별표(double asterik)를 붙이면 그 역할을 합니다.

3) keyword arguments를 줄인 말입니다.

4) *args는 각각의 인자를 의미한다면 **kargs는 별표가 두개인 만큼 딕셔너리의 key와 value값 쌍에 대응한다고 보면 됩니다.

 

이번에도 예시를 통해서 하나하나 알아봅니다.

1
2
3
4
5
6
7
8
9
10
dic = {"a" : 1"b" : 2"c" : 3"d" : 4}
a, b, **kwargs = dic
print(kwargs)
 
'''
결과
    a, b, **kwargs = dic
          ^
SyntaxError: invalid syntax
'''
cs

 

역시 안되는 군요.  kwargs의 경우에는 함수의 인자로 쓰는 경우만 생각해 봅시다.

 

1
2
3
4
5
6
7
8
9
10
dic = {"a" : 1"b" : 2"c" : 3"d" : 4}
def func(**kwargs):
    print(kwargs)
 
func(dic)
 
'''
결과
TypeError: func() takes 0 positional arguments but 1 was given
'''
cs

 

func 함수를 정의할 때 인자를 **kwargs로 넣고 딕셔너리 변수를 넣었지만 func함수는 0개의 positional 인자를 갖지만 1개의 인자를 넣었다고 에러가 뜹니다.

 

1
2
3
4
5
6
7
8
9
10
dic = {"a" : 1"b" : 2"c" : 3"d" : 4}
def func(**kwargs):
    print(kwargs)
 
func(**dic)
 
'''
결과
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
'''
cs

 

이를 해결하기 위해서 func함수 인자에 딕셔너리를 넣을때는 마찬가지로 **를 붙이면 됩니다.

 

그리고 아래와 같이 인자로 넣은 딕셔너리는 items(), keys(), values() 를 붙여 값들을 추출할 수 있습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
dic = {"a" : 1"b" : 2"c" : 3"d" : 4}
def func(**kwargs):
    print(kwargs)
    print(type(kwargs))
    print(kwargs.items())
    print(type(kwargs.items()))
    print(kwargs.keys())
    print(type(kwargs.keys()))
    print(kwargs.values())
    print(type(kwargs.values()))
 
func(**dic)
 
'''
결과
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
<class 'dict'>
dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
<class 'dict_items'>
dict_keys(['a', 'b', 'c', 'd'])
<class 'dict_keys'>
dict_values([1, 2, 3, 4])
<class 'dict_values'>
'''
cs

 

하지만 위의 dict_items, dict_keys, dict_values 의 경우에는 list나 tuple이 아니기 때문에 list로 감싸준 다음 각 값들을 추출해 낼 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dic = {"a" : 1"b" : 2"c" : 3"d" : 4}
def func(**kwargs):
    print(list(kwargs))
    print(list(kwargs.items()))
    print(list(kwargs.keys()))
    print(list(kwargs.values()))
 
func(**dic)
 
'''
결과
['a', 'b', 'c', 'd']
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
['a', 'b', 'c', 'd']
[1, 2, 3, 4]
'''
cs

 

딕셔너리에 바로 list()를 적용하면 key값들로만 리스트로 만들어준다는 것을 알수 있고 .items() 를 적용한 다음 list()를 적용하면 각 쌍들이 튜플로 묶이고 전체 리스트화 되는 것도 알 수 있습니다.

 

어떤 기능이든지 기본적인 개념을 파악한 이후에 내가 직접 응용하여 시도하고 또 실패와 성공을 반복하면서 능숙하게 익히게 되는것 같습니다.😁😎

+ Recent posts