객체 지향 프로그래밍/Python

패킹과 언패킹 이해하기

ghtis1798 2021. 3. 16. 01:55

Packing & Unpacking

패킹은 묶는 것, 언패킹은 다시 푼다는 뜻이다.

Iterable한 객체들을 대상으로 패킹과, 언패킹을 수행할 수 있다.

대표적으로 튜플이나 리스트를 대상으로 패킹과 언패킹을 사용할 수 있다.

튜플 패킹시에는 소괄호를 사용해도 되고 안해도 가능하다.

튜플을 언패킹할 때는 *를 사용하며 결과는 리스트로 묶인다.

📌Packing

t = 1,2,3,4,5
print(t)

📌Unpacking

nums = (1,2,3,4,5)
n1, n2, *others = nums
print(others)
# [3,4,5]

📌파라미터에 대해

함수의 파라미터에 *를 붙일 경우 나머지 값들은 패킹해서 전달하겠다는 것을 의미한다.

def sum(*nums):
    result = 0
    for x in nums:
        result += x
    return result
print(sum(1,2,3,4,5))

함수를 호출할 때 파라미터에 *를 붙일 경우 언패킹하여 전달하겠다는 것을 의미한다.

def show_man(name, age, height):
    print(name, age, height, sep=', ')
man = ('gh', 27, 170)
show_man(*man)

📌딕셔너리에 대해

딕셔너리는 key와 value로 구성되어 있다.

딕셔너리는 함수를 정의할 때나 호출할 때 어떻게 패킹&언패킹이 이루어질까?

✅함수 호출 시

*를 사용해 딕셔너리를 파라미터로 전달할 때

*만 사용할 경우 딕셔너리의 key 값이  언패킹되어 전달된다.

def test(a,b,c):
    print(a,b,c, sep=',')
d = dict(a=1, b=2, c=3)
test(*d)
# a,b,c

반면 **를 사용해 딕셔너리를 파라미터로 전달할 때

의 경우 딕셔너리의 value 값이 파라미터로 언패킹되어 전달된다.

def test(a,b,c):
    print(a,b,c, sep=',')
d = dict(a=1,b=2,c=3)
test(**d)
# 1,2,3

key,value 모두를 튜플로 전달할 때

def test(a,b,c):
    print(a,b,c, sep=',')
d = dict(a=1,b=2,c=3)
test(*d.items())
# ('a',1),('b',2),('c',3)

✅함수 정의 시

함수를 정의할 때 *와 **의 선언은 다르다.

*일 때는 튜플을 패킹하여 받는다.

전달된 값을 튜플로 패킹하여 받는 경우

def test(*args):
    print(args)
test(1) # (1,) 튜플 원소가 하나일 경우,가 존재함
test(1,2) # (1,2)
test(1,2,3) # (1,2,3)

**일 때는 딕셔너리를 패킹하여 받는다.

전달된 값을 key와 value로 묶은 뒤 딕셔너리로 패킹하여 받는 경우

def test(**args):
    print(args)
test(a=1,b=2)
# {'a':1, 'b':2}