[Python] packing, unpacking

Jae Gyeong Lee·2024년 9월 21일

1. packing

  • 여러 값을 하나의 변수로 묶어주는 것(tuple, list)

1.1. tuple 타입

pack_tuple = 1, 2, 3
print(pack_tuple)
>>> (1, 2, 3)

1.2. list 타입

pack_list = [1, 2, 3]
print(pack_list)
>>> [1, 2, 3]

2. unpacking

  • 묶여있는 하나 변수를 여러 값으로 풀어주는 것(tuple, list, string, dictionary)

2.1. tuple 타입

a, b, c = pack_tuple
print(a); print(b); print(c)
>>>
1
2
3

2.2. list 타입

a, b, c = pack_list
print(a); print(b); print(c)
>>> 
1
2
3

2.3. string 타입

pack_str = 'ABC'
a, b, c = pack_str
print(a); print(b); print(c)
>>>
A
B
C

2.4. dictionary 타입

pack_dic = {'Key1': 'Value1',
            'Key2': 'Value2',
            'Key3': 'Value3'}

2.4.1. key 값만 출력

a, b, c = pack_dic
print(a); print(b); print(c)
>>>
Key1
Key2
Key3

2.4.2. value 값만 출력

a, b, c = pack_dic.values()
print(a); print(b); print(c)
>>>
Value1
Value2
Value3

2.4.3. key, value 같이 출력

a, b, c = pack_dic.items()
print(a); print(b); print(c)
>>>
('Key1', 'Value1')
('Key2', 'Value2')
('Key3', 'Value3')

언더바(_)를 활용해 불필요한 변수는 생략 가능(관례)

a, _, c = pack_list
print(a); print(c)
>>>
1
3

3. *args, **kwargs

  • 함수에 넣어줄 인자가 가변적인 경우 활용

3.1. 숙지해야 할 기본 개념

3.1.1. 가변인자(Variable arguments)

  • 개수가 변할 수 있는 인자(즉, 개수가 명확히 정해져 있지 않은 인자)

3.1.2. 위치인자(Positional arguments)

  • 일반적으로 선언하는 인자, 함수에 순서대로 인자가 전달되는 경우 활용

3.1.3. 키워드인자(Keyword arguments)

  • 초기값을 지정해준 인자(예, param = default)

*args, **kwargs는 위치/키워드인자의 수가 많거나 함수에 넣어줄 인자의 수가 불명확한 경우(가변적인 경우) 활용

3.2. *args 활용

  • 의미: args는 위치인자를 뜻함
  • 사용: 위치인자 앞에 를 붙여서 사용(예, args)
  • 방식: 함수에 들어온 위치인자를 tuple 형태로 packing하여 처리
  • 인자 형태: 위치 기반(예, args_test(1,2,3))
  • 참고: args는 arguments의 약어, 다른 변수명(예, *numbers)을 사용해도 됨
def args_test(*args):
    print('받아온 형태: ', args); print()
    for arg in args:
        print(arg)
        
args_test(1,2,3)

>>>
받아온 형태:  (1, 2, 3)

1
2
3

함수에 tuple 형태의 인자를 직접 넣는 경우

a = (1,2,3)
args_test(*a)

>>>
받아온 형태:  (1, 2, 3)

1
2
3


# 함수 실행 시 인자로 a(tuple 형태) 앞에 * 을 붙여주면, 
# 함수에 들어가는 인자 a가 (1,2,3)가 아닌 1,2,3 로 변환
참고)

a = (1,2,3)
args_test(a)

>>>
받아온 형태:  ((1, 2, 3),)

(1, 2, 3)

3.3. **kwargs

  • 의미: kwargs는 키워드인자를 뜻함
  • 사용: 키워드인자 앞에 를 붙여서 사용(예, kwargs)
  • 방식: 함수에 들어온 키워드인자를 dictionary 형태로 packing하여 처리
  • 인자 형태: 키:값 쌍이 명시된 형태(예, kwargs_test(A=1, B=2, C=3))
  • 참고: kwargs는 keyword arguments의 약어, 다른 변수명(예, *words)을 사용해도 됨
def kwargs_test(**kwargs):
    print('받아온 형태: ', kwargs); print()
    for key, value in kwargs.items():
        print(key, value)

kwargs_test(A=1, B=2, C=3)

>>>
받아온 형태:  {'A': 1, 'B': 2, 'C': 3}

A 1
B 2
C 3

함수에 dictionary 형태의 인자를 직접 넣는 경우

a = {'A': 1, 'B': 2, 'C': 3}
kwargs_test(**a)

>>>
받아온 형태:  {'A': 1, 'B': 2, 'C': 3}

A 1
B 2
C 3


# 함수 실행 시 인자로 a(dictionary 형태) 앞에 ** 을 붙여주면, 
# 함수에 들어가는 인자 a가 {'A': 1, 'B': 2, 'C': 3}가 아닌 A=1, B=2, C=3 로 변환
참고)

a = {'A': 1, 'B': 2, 'C': 3}
kwargs_test(a)
>>> TypeError: kwargs_test() takes 0 positional arguments but 1 was given

3.4. *args, **kwargs 혼합 사용

주의: 반드시 위치인자(*args)가 키워드인자(**kwargs) 보다 먼저 위치해야 함

def mix_test(a, b, *args, c='6', d='7', **kwargs):
    print(f"1. General args:         {a}, {b}")
    print(f"2. Positional args:      {args}")
    print(f"3. Default Keyword args: {c}, {d}")
    print(f"4. Keyword args:         {kwargs}")
    
mix_test(1, 2, 3, 4, 5, x=8, y=9, z=10)


>>>
1. General args:         1, 2
2. Positional args:      (3, 4, 5)
3. Default Keyword args: 6, 7
4. Keyword args:         {'x': 8, 'y': 9, 'z': 10}

4. 기타

(참고) 각각의 dictionary 데이터(audio_metadata, db_meta)를 분해해, 새로운 dictionary(meta_data)에 합하여 저장

dic1 = {'A': 1,
        'B': 2,
        'C': 3}

dic2 = {'D': 4,
        'E': 5}

merge_dic = {**dic1, **dic2}
print(merge_dic)

>>>
{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}

활용 방법:

profile
안녕하세요 반갑습니다. 공부한 내용들을 기록하고 있습니다.

0개의 댓글