본문 바로가기
python/basic

[Python] Packing, Unpacking / 위치인자, 키워드인자

by wjwkddyd221001 2023. 5. 29.

개요

Packing은 인자로 받은 여러 개의 객체를 하나의 객체로 합쳐서 받아줍니다.

 

Unpacking은 여러 개의 객체를 포함하는 하나의 객체를 풀어줍니다.

 

위치 인자(Positional argument)의 경우에는 *(asterisk)를 붙여서, 키워드 인자(Keyword argument)의 경우에는 **를 붙여서 사용할 수 있습니다.

 

Packing

Packing을 이용하면, 함수가 받을 인자의 개수를 가변적으로 지정할 수 있습니다.

 

함수에서 Packing

위치 인자 Packing은 *(asterisk)를 매개변수 앞에 붙입니다. 

함수는 위치 인자를 받아 하나의 튜플(tuple)로 관리합니다. 

def func(*args):
      print(args)
      print(type(args))
      
func(0,1,2,3,4,5,6,7,8,9)


# 다음과 같이 출력됩니다.
'''
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
<class 'tuple'>
'''

 

키워드 인자 Packing은 **를 매개변수 앞에 붙입니다.

함수는 키워드와 인자 쌍으로 이루어진 키워드 인자를 받아 하나의 딕셔너리(dict)로 관리합니다.

def func(**kwargs):
     print(kwargs)
     print(type(kwargs))

func(a=1, b=2, c=3, d=4, e=5)

# 다음과 같이 출력됩니다.
'''
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
<class 'dict'>
'''

 

위치 인자와 키워드 인자를 동시에 사용할 수 있습니다.

def func(*args, **kwargs):
    print(args)
    print(type(args))
    print("="*50)
    print(kwargs)
    print(type(args))
    
func(0,1,a=0,b=1)
 

# 다음과 같이 출력됩니다.
'''
(0, 1)
<class 'tuple'>
==================================================
{'a': 0, 'b': 1}
<class 'tuple'>
'''

 

에러

키워드 인자는 입력되는 인자들의 가장 마지막에 위치해야 합니다. 

따라서 다음과 같은 경우에는 에러가 발생합니다. 

# 상황 01
# 함수 선언이 잘못되었습니다.
def func(**kwargs, *args): # Positional argument는 keyword argument 뒤에 있을 수 없습니다.
    print(args)
    print(type(args))
    print("="*50)
    print(kwargs)
    print(type(args))
    

# 상황 02
# 함수는 정상적으로 선언되었지만, 호출이 잘못되었습니다. 
def func(*args, **kwargs):
    print(args)
    print(type(args))
    print("="*50)
    print(kwargs)
    print(type(args))
    
func(a=0,b=1,0) # Positional argument는 keyword argument 뒤에 있을 수 없습니다.

 

Unpacking

Python의 문자열(str), 튜플(tuple), 리스트(list), 딕셔너리(dict), 집합(set)과 같은 container 객체의 경우에 여러 개의 객체를 포함하고 있습니다. Unpacking은 여러 개의 객체를 포함하는 하나의 객체를 풀어줍니다.

 

<container 객체에 대한 자세한 설명>

https://cross-the-line.tistory.com/19

 

기본 - 여러 개의 변수를 한 번에 초기화하기

다음과 같이 여러 개의 변수를 한 번에 초기화 할 수 있습니다. 

아래는 변수의 갯수와 변수값의 갯수가 같은 경우입니다.

fruits = ["apple", "banana", "cherry"]
x, y, z = fruits
print(x)
print(y)
print(z)


# 다음과 같이 출력됩니다.
'''
apple
banana
cherry
'''

 

아래는 변수의 갯수와 변수값의 갯수가 다른 경우입니다.

fruits = ("apple", "mango", "papaya", "pineapple", "cherry")

(green, *tropic, red) = fruits

print(green)
print(tropic)
print(red)


# 다음과 같이 출력됩니다.
'''
apple
['mango', 'papaya', 'pineapple']
cherry
'''

 

Container 객체 Unpacking

문자열(str), 튜플(tuple), 리스트(list), 딕셔너리(dict), 집합(set)을 위치 인자로 Unpacking 했을 때, 다음과 같은 결과를 얻을 수 있습니다.

print(*"Hello")                         # 문자열 
print(*(1,2,3))                         # 튜플
print(*[4,5,6])                         # 리스트
print(*{7,8,9})                         # 집합
                                        # 딕셔너리
print(*{"a":1, "b":2, "c":3})           # key
print(*{"a":1, "b":2, "c":3}.values())  # value
print(*{"a":1, "b":2, "c":3}.items())   # (key, value)


# 다음과 같이 출력됩니다.
'''
H e l l o
1 2 3
4 5 6
8 9 7

a b c
1 2 3
('a', 1) ('b', 2) ('c', 3)
'''

 

여러 Container 객체들을 하나로 합칠 수도 있습니다.

다음과 같이 리스트로 합칠 수도 있습니다. 예시는 문자열뿐이지만 다른 Container 객체들도 가능합니다.

# 리스트로 표현
a = "Hello"
b = "World"
c = [*a, *b]
print(c)


# 다음과 같이 표시됩니다.
'''
['H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd']
'''

 

다음과 같이 튜플로 합칠 수도 있습니다. 

# 튜플로 표현
a = "Hello"
b = "World"
c = (*a, *b)
print(c)


# 다음과 같이 표시됩니다.
'''
('H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd')
'''

 

다음과 같이 딕셔너리로 합칠 수도 있습니다.

하나의 딕셔너리로 합쳐질 때, 중복되는 key값이 있으면 마지막의 key값과 value값만 남게됩니다.

아래 예시의 d3, d4의 'l'의 차이를 참고하세요.

d1 = {"H":0, "e":1, "l":2}
d2 = {"l":3, "o":4}
d3 = {**d1, **d2}
print(d3)
d4 = {**d2, **d1}
print(d4)


# 다음과 같이 표시됩니다.
'''
{'H': 0, 'e': 1, 'l': 3, 'o': 4}
{'l': 2, 'o': 4, 'H': 0, 'e': 1}
'''

 

 

함수에서 Unpacking

함수에서 위치 인자를 Unpacking을 할 때는 매개변수 앞에 *를 붙이는 것이 아니라 인자 앞에 *를 붙입니다.

def func(a, b, c):
    print(a, b, c)
    print(type(a), type(b), type(c))
    
input = [1,'a',3]
func(*input)


# 다음과 같이 출력됩니다.
'''
1 a 3
<class 'int'> <class 'str'> <class 'int'>
'''

 

위의 코드는 다음과 같은 순서로 실행됩니다.

func(*input)
func(*[1,'a',2])
func(1,'a',2)

 

함수에서 키워드 인자를 Unpacking할 때는 인자로 딕셔너리를 사용하고 인자 앞에 **를 붙입니다.

이 때, 딕셔너리의 key는 매개변수의 매개 변수와 일치해야 합니다.

def func(arg1, arg2):
    print(arg1)
    print(arg2)


func(**{"arg1": 1, "arg2":2})
func(**{"arg1": 1, "arg3":3})	 # 에러 : arg3라는 매개변수가 없습니다.

# 다음과 같이 출력됩니다. 
'''
1
2
'''

 

참고자료

https://wikidocs.net/22801

https://www.w3schools.com/python/python_variables_multiple.asp

https://www.w3schools.com/python/python_tuples_unpack.asp

https://cross-the-line.tistory.com/19

https://yeko90.tistory.com/entry/파이썬-중급-unpacking에-대해서-잘-알고-계시나요-사용법