*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 = [1, 2, 3, 4, 5]
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 = [1, 2, 3, 4, 5]
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()를 적용하면 각 쌍들이 튜플로 묶이고 전체 리스트화 되는 것도 알 수 있습니다.
어떤 기능이든지 기본적인 개념을 파악한 이후에 내가 직접 응용하여 시도하고 또 실패와 성공을 반복하면서 능숙하게 익히게 되는것 같습니다.😁😎