Programing Language/Python

아스테리스크와 패킹, 언패킹 기법

JHeaon 2023. 6. 29. 04:47

 

파이썬 코드를 보면 인자로 받는 부분에 *arg, **kwargs라는 표현을 많이 볼 수 있다. arg, kwarg가 어떤 변수의 이름인 것은 알겠지만 앞서 붙어있는 "*" 표현은 낯설기만 하다. 따라서 이번에는 해당 표현에 대해서 알아보고 어떻게 사용하는지에 대해서 알아보자. 

 

 

파이썬의 아스테리스크 (Asterisk " * ")

파이썬이 지원하는 여러 연산자 중에 하나인 아스테리스크 (이하 * )는 단순히 곱셈만이 아닌 여러 의미를 가진 연산들을 지원하고 있다. 크게 4가지 종류로 사용이 된다. 

 

  • 곱셈, 거듭제곱 연산으로 사용
  • 시퀸스 타입의 데이터를 반복 확장하고자 할 때 사용
  • 가변인자를 사용하고자 할 때 사용
  • 컨테이너(시퀸스) 타입의 데이터를 언패킹 할 때 사용

 

1, 2 문항은 자주 사용하기도 하고 대부분 파이썬 기초에서 배워서 기본적으로 이해 가능한 영역이지만 3, 4 문항은 쉽게 접하지는 않는 상황이다. 따라서 해당 3, 4 문항에 대해서 아래 예시를 통해 좀 더 알아보도록 하자. 

 

 

가변 인자

가변인자란 인자의 개수가 변하는 인자를 의미한다. 가변 인자는 주로 어떤 함수가 있는데 이 함수에 대해서 매개변수가 얼마나 들어올지 모르는 상황에 자주 사용한다. 아래는 가변인자를 사용하는 예이다.

 

🖥️ code.py

def sums(*args):
    return sum(args)

a, b, c = 1, 2, 3
print(sums(a, b, c)) # 6

a, b, c, d = 1, 2, 3, 4
print(sums(a, b, c, d)) # 10

 

여기서 *args의 역할은 인자로 넘어오는 값들을 마치 시퀀스 객체형태로 저장해 주는 역할을 한다. 즉 args = (a, b, c)와 같은 역할을 한다라는 의미이다. 실제로 type(args)을 찍어보면 리턴 값이 튜플이 나오는 것을 확인할 수 있다. 

 

🖥️ code.py

def sums(*args):
    print(type(args))
    return sum(args)

a, b, c = 1, 2, 3
sums(a, b, c)

# <class 'tuple'>

 

여기서 args 뜻은 말 그대로 argument(인자)를 줄여서 한 말이고 실제 사용 할 때에는 args 말고 다른 abc, temp 등의 변수명을 사용해도 무방하다. 여기서 세트로 자주 나오는 것이 **kwargs인데 이는 keyword arguments의 줄임말로 키값을 가진 데이터를 dict 형태로 저장하는 역할을 한다. 다음은 *args와 **kwargs 활용한 예시이다. 

 

🖥️ code.py

def sums(*args, **kwargs):
    print(type(args)) # <class 'tuple'>
    print(type(kwargs)) # <class 'dict'>
    print(args) # (1, 2, 3)
    print(kwargs) # {'d': 4, 'e': 5, 'f': 6}
    
    return sum(args)

a, b, c = 1, 2, 3
sums(a, b, c, d=4, e=5, f=6)

 

 

 

 

 

 

패킹과 언패킹

패킹이란 앞서 *args와 **kwargs을 정리한 것과 같이 여러 개의 매개변수를 쓰기 위해 사용하는 것을 의미한다. 말이 조금 어렵지만 아래의 코드를 보면서 이해를 하도록 해보자. 

 

🖥️ code.py

temp = 1, 2, 3
print(type(temp)) # tuple
print(temp) # (1, 2, 3)

 

해당 코드를 보면 temp 변수에 1, 2, 3이라는 값이 순차적으로 튜플에 들어간 것을 확인할 수 있다. 이렇게 여러 개의 값들 혹은 여러 개의 매개변수를 하나로 모아 포장한다는 의미로 이러한 기법을 패킹이라고 부르고 있다. 반대로 언패킹은 모아둔 값을 풀어서 각자의 인자에 넣는 행위를 의미하는데 아래는 그 예시 코드이다.

 

🖥️ code.py

def sum(a, b, c):
    return a + b + c

n = (1, 2, 3)
print(sum(n))

# TypeError: sum() missing 2 required positional arguments: 'b' and 'c'

 

해당 코드를 살펴보면 sum(n)을 실행할 때 a값에는 튜플 n이 들어가고 b, c 인자에는 아무 값이 들어가지 않는 상황이 연출된다. 즉 n의 요소에 따라서 a, b, c 각각의 인자에 값을 넣어 주기 위해서는 n이라는 튜플을 풀어서 각각의 인자에게 값을 넘겨줄 필요성이 있다. 이때 사용하는 것이 파이썬 연산자인 아스테리스크(*) 이다. 

 

🖥️ code.py

def sum(a, b, c):
    return a + b + c

n = (1, 2, 3)
print(sum(*n)) # 인자에 각각 a = 1, b = 2, c = 3 이 들어감

# 6

 

이렇게 아스테리스크를 이용하게 되면 각각의 인자에 적절하게 값을 넘겨줄 수 있게 된다.

'Programing Language/Python'의 다른글

  • 현재글 아스테리스크와 패킹, 언패킹 기법

관련글