언패킹에 대해 개념부터 좀 더 자세히 설명해줘.

**언패킹(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

+ Recent posts