파이썬 코드를 보면 인자로 받는 부분에 *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' 카테고리의 다른 글
typing module (Type annotation and Typehint) 을 통한 가독성 좋은 코드 작성하기 (0) | 2023.06.29 |
---|---|
리스트 컴프리헨션과 삼항연산자을 이용하여 코드 작성하기 (0) | 2023.06.29 |
mypy, pyright 을 이용한 정적 타입 검사 (2) | 2023.06.27 |
파이썬의 객체지향 프로그래밍 4가지 특성과 객체 메모리 효율적으로 다루기 (0) | 2023.06.25 |
sqlite3 모듈을 통해 sqlite3.db 파일 관리하기 (3) | 2023.06.20 |