언패킹에 대해 개념부터 좀 더 자세히 설명해줘.
**언패킹(Unpacking)**은 컨테이너(리스트, 튜플 등)의 요소들을 개별 변수로 분해하는 것이에요!
기본 개념:
패킹(Packing) vs 언패킹(Unpacking)
# 패킹: 여러 값을 하나로 묶기
data = ('김철수', 20, '컴퓨터과') # 값들을 튜플로 패킹
# 언패킹: 묶인 것을 개별로 분해하기
name, age, major = data # 튜플을 개별 변수로 언패킹
언패킹의 다양한 형태:
1. 튜플 언패킹
point = (10, 20)
# 언패킹
x, y = point
print(x) # 10
print(y) # 20
# 언패킹 없이 한다면
x = point[0] # 10
y = point[1] # 20
2. 리스트 언패킹
colors = ['빨강', '파랑', '노랑']
# 언패킹
red, blue, yellow = colors
print(red) # 빨강
print(blue) # 파랑
print(yellow) # 노랑
3. 문자열 언패킹
word = "ABC"
# 언패킹
a, b, c = word
print(a) # A
print(b) # B
print(c) # C
언패킹의 규칙:
개수가 맞아야 함
data = (1, 2, 3)
# ✅ 올바른 언패킹 (개수 일치)
a, b, c = data
# ❌ 오류 발생 (개수 불일치)
# a, b = data # ValueError: too many values to unpack
# a, b, c, d = data # ValueError: not enough values to unpack
별표(*) 언패킹
numbers = (1, 2, 3, 4, 5)
# 첫 번째와 마지막만, 나머지는 middle에
first, *middle, last = numbers
print(first) # 1
print(middle) # [2, 3, 4]
print(last) # 5
# 첫 번째만, 나머지는 rest에
first, *rest = numbers
print(first) # 1
print(rest) # [2, 3, 4, 5]
실제 활용 예시:
함수에서 여러 값 반환
def get_name_age():
return "김철수", 25
# 언패킹으로 받기
name, age = get_name_age()
print(f"{name}는 {age}살") # 김철수는 25살
딕셔너리 아이템 언패킹
student = {"이름": "이영희", "점수": 95}
for key, value in student.items():
# 각 아이템이 ('이름', '이영희') 형태로 언패킹됨
print(f"{key}: {value}")
좌표 계산
points = [(1, 2), (3, 4), (5, 6)]
for x, y in points:
distance = (x**2 + y**2)**0.5
print(f"점({x}, {y})의 거리: {distance:.2f}")
고급 언패킹:
중첩 언패킹
nested_data = (('김철수', 20), ('이영희', 22))
# 중첩된 구조도 언패킹 가능
(name1, age1), (name2, age2) = nested_data
print(name1, age1) # 김철수 20
print(name2, age2) # 이영희 22
무시하기 (언더스코어 사용)
data = ('김철수', 85, 92, 78, 'A')
# 필요 없는 값은 _ 로 무시
name, math, _, science, _ = data
print(name) # 김철수
print(math) # 85
print(science) # 78
딕셔너리 언패킹
def introduce(name, age, city):
print(f"{name}은 {age}살, {city}에 살아요")
person = {"name": "김철수", "age": 25, "city": "서울"}
# ** 로 딕셔너리 언패킹
introduce(**person) # 김철수은 25살, 서울에 살아요
함수 매개변수에서 언패킹:
*리스트 언패킹 (args)
def print_numbers(*numbers):
for num in numbers:
print(num)
data = [1, 2, 3, 4, 5]
print_numbers(*data) # 리스트를 개별 인수로 언패킹
**딕셔너리 언패킹 (kwargs)
def create_user(**info):
for key, value in info.items():
print(f"{key}: {value}")
user_data = {"name": "김철수", "age": 25, "email": "kim@example.com"}
create_user(**user_data) # 딕셔너리를 키워드 인수로 언패킹
언패킹 활용 패턴:
변수 교환
# 기존 방법
a, b = 10, 20
temp = a
a = b
b = temp
# 언패킹 활용
a, b = 10, 20
a, b = b, a # 한 줄로 교환!
print(a, b) # 20 10
여러 값 동시 할당
# 여러 변수에 같은 값
a = b = c = 0
# 여러 변수에 다른 값 (언패킹 활용)
name, age, city = "김철수", 25, "서울"
CSV 데이터 처리
csv_data = [
"김철수,25,서울",
"이영희,23,부산",
"박민수,27,대구"
]
for line in csv_data:
name, age, city = line.split(',')
print(f"{name} ({age}세) - {city}")
언패킹의 장점:
1. 가독성 향상
# 언패킹 없이
student = ('김철수', 85, 92, 78)
print(f"{student[0]}의 수학 점수: {student[1]}")
# 언패킹 사용
name, math, english, science = student
print(f"{name}의 수학 점수: {math}") # 훨씬 읽기 쉬움!
2. 코드 간결화
# 여러 줄 필요
point = (10, 20)
x = point[0]
y = point[1]
# 한 줄로 해결
x, y = (10, 20)
3. 실수 방지
# 인덱스 실수 가능성
student = ('김철수', 85, 92)
name = student[0]
math = student[2] # 실수! english 점수
# 언패킹은 순서대로
name, math, english = student # 명확함
요약:
언패킹 = "포장된 것을 풀어서 각각 나누어 주기" 📦➡️📄📄📄
- 튜플, 리스트, 문자열 등 모든 iterable 객체에 사용 가능
- 개수 맞춤 중요! (별표 사용으로 유연하게 가능)
- 코드 가독성과 간결성 크게 향상
- for문, 함수 매개변수, 변수 할당 등 다양한 곳에서 활용
Python의 매우 강력하고 우아한 기능 중 하나예요! 🐍✨
student_scores = [
('김철수', 85, 92, 78),
('이영희', 92, 88, 95),
('박지민', 75, 83, 90),
('최민서', 97, 79, 87)
]
# 반복문에서 언패킹 사용
for name, database, python, cloud in student_scores:
average = (database + python + cloud) / 3
print(f'{name}의 평균 점수: {average:.1f}')
위 코드에서 name에 대응하는게 ('김철수', 85, 92, 78)가 아니라 '김철수'인거지?
네, 맞아요! name에는 '김철수'만 들어가요.
언패킹(Unpacking)이 일어나는 과정:
1단계: 튜플을 하나씩 꺼냄
# 첫 번째 반복
current_tuple = ('김철수', 85, 92, 78)
2단계: 튜플을 각 변수에 분해
# 언패킹 발생!
name, database, python, cloud = ('김철수', 85, 92, 78)
# 결과:
name = '김철수' # 첫 번째 요소
database = 85 # 두 번째 요소
python = 92 # 세 번째 요소
cloud = 78 # 네 번째 요소
시각적으로 보면:
('김철수', 85, 92, 78)
↓ ↓ ↓ ↓
name database python cloud
언패킹 없이 했다면:
for student in student_scores:
# student = ('김철수', 85, 92, 78) 전체 튜플
name = student[0] # '김철수'
database = student[1] # 85
python = student[2] # 92
cloud = student[3] # 78
average = (database + python + cloud) / 3
print(f'{name}의 평균 점수: {average:.1f}')
다른 언패킹 예시들:
부분 언패킹
for name, *scores in student_scores:
# name = '김철수'
# scores = [85, 92, 78] (나머지 모두)
average = sum(scores) / len(scores)
print(f'{name}: {average:.1f}')
첫 번째만 필요한 경우
for name, _, _, _ in student_scores:
# name만 사용, 나머지는 무시
print(f'학생: {name}')
마지막만 무시
for name, database, python, *_ in student_scores:
# 마지막 점수는 무시
avg = (database + python) / 2
print(f'{name}: {avg:.1f}')
확인해보기:
student_scores = [('김철수', 85, 92, 78)]
for name, database, python, cloud in student_scores:
print(f"name의 타입: {type(name)}") # <class 'str'>
print(f"name의 값: {name}") # 김철수
print(f"database의 타입: {type(database)}") # <class 'int'>
print(f"database의 값: {database}") # 85
요약:
- 언패킹 전: ('김철수', 85, 92, 78) (튜플 전체)
- 언패킹 후: name = '김철수', database = 85, python = 92, cloud = 78
언패킹은 튜플/리스트를 각각의 변수로 분해하는 과정이에요! 🎯
마치 선물 상자를 열어서 각각의 선물을 꺼내는 것과 같죠!
'note' 카테고리의 다른 글
python의 모듈 (1) | 2025.09.17 |
---|---|
python - FOR문 (0) | 2025.09.16 |
response = client.chat.completions.create() (1) | 2025.09.15 |
패키지와 라이브러리의 차이. (1) | 2025.09.14 |
bash, zsh, venv, Django, UV, pip (0) | 2025.09.14 |