우선 _args와 *_kwargs에 대해 알아보기 전에,
python에는 Packing
과 Unpacking
이라는 것이 있다.
Packing
여러개의 데이터를 list, tuple 등의 컬렉션으로 감싸는 것 (묶는 것)
greetings = ('hello', 'konnichiwa', 'annyneong',)
Unpacking
컬렉션의 element들을 여러 변수에 푸는 것
en, jp, ko = greetings
이제 함수를 보자
def args_func(*args):
print(args)
print(type(args)) # <class 'tuple'>
args_func(1, 2, 3) # (1, 2, 3)
args_func((1, 2, 3)) # ((1, 2, 3),) # (1, 2, 3) 이 tuple의 element로 들어간다.
args_func([1, 2, 3]) # ([1, 2, 3],) # [1, 2, 3] 이 tuple의 element로 들어간다.
이건 이해하기 쉽다. 단순히 여러 파라미터를 tuple로 packing되어 사용하는 것이기 때문이다.
def args_func(*args):
print(args)
print(type(args)) # <class 'tuple'>
my_tuple = (1, 2, 3)
args_func(*my_tuple) # (1, 2, 3)
나는 개인적으로 여기서 헷갈렸다.
왜 args_func(my_tuple)
가 아니고 *이 붙는지 이해를 잘 못했다.
그럼 이렇게 보면 어떨까
print((1, 2, 3)) # (1, 2, 3)
print(*(1, 2, 3)) # 1, 2, 3
print(1, 2, 3) # 1, 2, 3
2번째 줄과 3번째 줄은 서로 같은 결과를 출력한다.
이렇게 보면 *(1, 2, 3) 의 경우 (1, 2, 3)이라는 튜플이 unpacking된 결과라고 볼 수 있다.
그러므로 args_func(*args)의 경우는
my_tuple = (1, 2, 3)
1. args_func(*my_tuple)
2. args_func(*(1, 2, 3))
3. args_func(1, 2, 3)
이렇게 되는 것이고 볼 수 있을 것이다.
이를 확장시켜 생각해보면
def kwargs_func(**kwargs):
print(kwargs)
print(type(kwargs)) # <class 'dict'>
kwargs_func(en='hello', jp='konnichiwa', ko='annyneong') # {'en': 'hello', 'jp': 'konnichiwa', 'ko': 'annyneong'}
kwargs_func(a=1, b=2, c=3) # {'a': 1, 'b': 2, 'c': 3}
my_dict = {'hello': 'world', '안녕': '세계'}
kwargs_func(**my_dict) # {'hello': 'world', '안녕': '세계'}
위 예제에서 kwargs_func(**my_dict)
에서 **
를 왜 사용했는지 이해가 될 것이다.
'Python > Python' 카테고리의 다른 글
reduce를 언제 사용할 수 있을까 (0) | 2024.06.05 |
---|---|
2차원 List 에서 distinct 처리하기 (0) | 2024.02.12 |
== 와 is 비교 (0) | 2020.12.28 |
function의 default parameter 사용 시 주의점 (0) | 2020.12.28 |
댓글