패킹(packing)은 여러 값을 하나의 변수에 모으는 기능입니다. 튜플 패킹, 리스트/딕셔너리 패킹, 함수 인자 패킹(*args, **kwargs)을 중심으로 실전에서 자주 만나는 예제를 20개로 정리했습니다.
a = 10, 20, 30 처럼 쓰면 실제로는 (10, 20, 30) 튜플로 묶입니다.*args는 위치 인자들을 튜플로 패킹하고, **kwargs는 키워드 인자들을 딕셔너리로 패킹합니다.*, **로 풀어 꺼내는 것은 언패킹입니다.| 형태 | 의미 |
|---|---|
a = 1, 2, 3 | 튜플로 패킹 |
def f(*args) | 위치 인자 패킹 |
def f(**kwargs) | 키워드 인자 패킹 |
[*a, *b] | 여러 시퀀스를 하나로 묶기 |
{**x, **y} | 여러 딕셔너리 병합 |
*args는 개수가 정해지지 않은 값을 받을 때 유용합니다.**kwargs는 옵션을 유연하게 받을 때 자주 사용됩니다.a = 10, 20, 30
print(a)
print(type(a))쉼표로 값을 나열하면 자동으로 하나의 튜플로 묶입니다. 괄호가 없어도 패킹이 일어납니다.
words = 'python', 'is', 'fun'
print(words)문자열도 마찬가지로 하나의 튜플에 묶입니다. 여러 값을 한 번에 저장하고 싶을 때 간단히 사용할 수 있습니다.
x = 5,
print(x)
print(type(x))값이 하나여도 쉼표가 있으면 튜플입니다. (5)는 정수이지만 (5,) 또는 5,는 튜플입니다.
name = 'Kim'
age = 17
grade = 2
student = name, age, grade
print(student)서로 다른 자료형도 하나의 튜플로 묶을 수 있습니다. 학생 정보, 좌표, 설정값 등에 많이 쓰입니다.
def calc(a, b):
return a + b, a - b, a * b
result = calc(8, 3)
print(result)함수에서 여러 값을 반환하면 실제로는 튜플로 패킹되어 돌아옵니다. 파이썬에서 매우 자주 쓰이는 패턴입니다.
point = 3, 7
print(f'x좌표: {point[0]}, y좌표: {point[1]}')좌표처럼 순서가 중요한 데이터를 하나로 묶어 저장할 때 튜플 패킹이 적합합니다.
pairs = []
for i in range(1, 4):
pairs.append((i, i ** 2))
print(pairs)반복문 안에서 관련된 값들을 튜플로 패킹하여 리스트에 저장하면 표처럼 구조화된 데이터를 만들 수 있습니다.
names = ['A', 'B', 'C']
scores = [90, 80, 100]
result = list(zip(names, scores))
print(result)zip()은 각 위치의 값을 모아 튜플로 만들어 줍니다. 즉, 자동 패킹이 일어나는 대표적인 예입니다.
def add_all(*args):
print(args)
return sum(args)
print(add_all(1, 2, 3, 4, 5))*args는 전달된 위치 인자들을 하나의 튜플로 패킹합니다. 개수가 가변적인 입력을 받을 때 유용합니다.
def my_max(*nums):
return max(nums)
print(my_max(7, 2, 19, 4))숫자 개수가 달라도 모두 튜플로 모인 뒤 함수 안에서 한꺼번에 처리할 수 있습니다.
def profile(**kwargs):
print(kwargs)
profile(name='Lee', age=18, school='Science High')**kwargs는 키워드 인자들을 하나의 딕셔너리로 패킹합니다. 옵션값이나 설정값을 받을 때 매우 많이 사용됩니다.
def settings(**options):
for k, v in options.items():
print(k, '=>', v)
settings(theme='dark', lang='ko', font_size=14)미리 정해 두지 않은 다양한 옵션을 유연하게 받을 수 있다는 점이 **kwargs의 장점입니다.
def intro(title, *names):
print(title)
print(names)
intro('참가자 목록', '민수', '서연', '지우')앞쪽의 일반 매개변수는 고정값을 받고, 남은 위치 인자들은 *names가 튜플로 패킹합니다.
def make_student(name, **info):
print('이름:', name)
print('추가정보:', info)
make_student('지민', age=17, club='math')필수 정보는 따로 받고, 추가 정보는 딕셔너리로 모아 받는 구조입니다. 실무에서도 자주 보이는 패턴입니다.
def show_all(*args, **kwargs):
print('args =', args)
print('kwargs =', kwargs)
show_all(1, 2, 3, name='Kim', level='A')위치 인자는 튜플로, 키워드 인자는 딕셔너리로 각각 패킹됩니다. 두 종류를 한 함수에서 모두 처리할 수 있습니다.
a = [1, 2]
b = [3, 4]
c = [*a, *b]
print(c)여기서는 *를 이용해 각 리스트의 원소를 꺼내 새 리스트에 넣습니다. 결과적으로 여러 시퀀스를 하나로 모으는 패킹 형태로 볼 수 있습니다.
t = (10, 20)
lst = [30, 40]
merged = [*t, *lst, 50]
print(merged)튜플, 리스트처럼 서로 다른 시퀀스 자료형도 *를 사용해 같은 리스트 안으로 모을 수 있습니다.
basic = {'name': 'Yuna', 'age': 18}
extra = {'school': 'High School', 'grade': 3}
student = {**basic, **extra}
print(student)**를 사용하면 여러 딕셔너리의 키-값 쌍을 하나의 새 딕셔너리로 모을 수 있습니다.
common = {'sep': ' / ', 'end': ' 끝!\n'}
print('A', 'B', 'C', **common)여러 설정값을 딕셔너리로 모아 두었다가 함수 호출 때 넘기면 재사용성이 좋아집니다. 딕셔너리에 미리 패킹해 둔 옵션을 활용하는 예입니다.
def order_summary(customer, *items, **options):
print('고객:', customer)
print('상품들:', items)
print('옵션들:', options)
order_summary(
'김인수',
'노트북', '마우스', '키보드',
payment='card',
delivery='express'
)고객 이름은 일반 매개변수, 상품 목록은 *items로 튜플 패킹, 결제/배송 옵션은 **options로 딕셔너리 패킹합니다. 실전에서 가장 자주 보는 종합 구조입니다.
*args: 위치 인자를 튜플로 받는다.**kwargs: 키워드 인자를 딕셔너리로 받는다.[*a, *b], {**x, **y}: 여러 자료를 하나로 결합할 수 있다.패킹은 짧아 보여도 매우 강력한 문법입니다. 함수, 자료구조, 반복 처리, 옵션 설계까지 폭넓게 연결되므로 꼭 익혀 두면 좋습니다.