본문 바로가기
파이썬

파이썬 언패킹

by 왕초보 독학 코딩 2024. 1. 1.

파이썬 언패킹은 시퀀스(튜플, 리스트 등)의 요소를 개별 변수로 추출하는 것을 말한다. 이를 통해 여러 값을 동시에 변수에 할당할 수 있다. 언패킹은 주로 튜플이나 리스트의 요소를 변수로 분리할 때 사용된다. 여기서는 파이썬 언패킹이 무엇인지 알아보고, 언패킹의 다양한 기법을 소개하겠다.

 

 

 

기본 언패킹

다음은 파이썬 언패킹의 간단한 예제이다. 리스트의  각 요소들이 a, b, c 변수에 할당된다.

numbers = [1, 2, 3]
a, b, c = numbers  # numbers 리스트 언패킹

print(a)  # 1
print(b)  # 2
print(c)  # 3

 

튜플도 동일한 방법으로 언패킹할 수 있다.

coordinates = (4, 5)
x, y = coordinates

print(x)  # 4
print(y)  # 5

 

언패킹은 변수의 개수와 시퀀스의 요소의 개수가 일치해야 한다. 만약 불일치하면 ValueError가 발생한다.

x, y, z = coordinates

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
a, b = numbers

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

 

 

 

언패킹을 사용하는 이유

언패킹을 사용하면 시퀀스의 요소에 의미를 부여할 수 있으므로 가독성이 높아진다.

언패킹을 사용하지 않고 인덱스로 접근하게 된다면, 해당 요소가 어떤 의미로 사용되는지 이해하기 힘들게 된다. 

print(coordinates[0], coordinates[1])

 

하지만 언패킹을 사용하면 각 요소를 변수에 할당하기 때문에 의미를 부여할 수 있게 된다. 다음과 같이 coordinates를 언패킹하면 coordinates[0]은 x, coordinates[1]은 y임을 확실히 할 수 있게 된다.

x, y = coordinates
print(x, y)

 

 

 

 

별표(*)를 사용한 언패킹

*를 사용하면 나머지 요소를 하나의 변수에 리스트로 할당할 수 있다.

first, *rest = [1, 2, 3, 4, 5]

print(first)  # 1
print(rest)  # [2, 3, 4, 5]

 

*를 언패킹 처음이나 중간에 사용하여 특정 위치의 요소를 무시할 수 있다.

*rest, last = [1, 2, 3, 4, 5]

print(rest)  # [1, 2, 3, 4]
print(last)  # 5
first, *rest, last = [1, 2, 3, 4, 5]

print(first)  # 1
print(rest)  # [2, 3, 4]
print(last)  # 5

 

 

 

인자 전달 시 언패킹

함수나 메서드의 인자로 시퀀스를 전달 시 언패킹할 수도 있다.

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

numbers = [1, 2, 3]
result = add_numbers(*numbers)
print(result)  # 6

 

만일 언패킹을 하지 않는다면 다음과 같이 코드를 작성해야 할 것이다.

result = add_numbers(numbers[0], numbers[1], numbers[2])

 

 

 

반복문에서 언패킹 사용하기

반복문에서도 언패킹은 유용하게 사용된다.

persons = {'Alice': 25, 'Bob': 30}

for person in persons.items():
    name, age = person
    print(f"{name}: {age}")

 

하지만 아래와 같이 더 간단하게 코드를 작성할 수 있게 된다.

for name, age in persons.items():
    print(f"{name}: {age}")

 

 

 

언패킹으로 간단한 스왑 구현하기

두 변수의 값을 교환해야 하는 경우가 있다. 다른 언어를 사용해 본 개발자들은 보통 다음과 같이 작성할 것이다.

a = 1
b = 10

temp = a
a = b
b = temp

print(a, b)  # 10, 1

 

하지만 언패킹을 사용하면 훨씬 더 간단하게 스왑을 구현할 수 있고, 성능도 좋다고 한다.

a = 1
b = 10

a, b = b, c

print(a, b)  # 10, 1

 

 

 

체인 언패킹

여러 단계로 중첩된 시퀀스에서 값을 언패킹할 수도 있다.

nested_list = [1, [2, 3], 4]
a, (b, c), d = nested_list

 

 

 

함수와 메서드의 반환 값 언패킹

함수와 메서드가 여러 값을 반환할 때, 호출하는 쪽에서 언패킹을 사용하여 값을 개별 변수에 할당할 수도 있다.

def get_point():
    return 1, 2
    
x, y = get_point()

 

 

 

언패킹을 이용한 확장

언패킹을 이용해서 리스트와 튜플을 확장시킬 수 있다.

list1 = [1, 2, 3]
list2 = [*list1, 4, 5]

tuble1 = (1, 2, 3)
tuble2 = (*tuble1, 4, 5)

'파이썬' 카테고리의 다른 글

파이썬 namedtuple  (1) 2024.01.07
파이썬의 던더 메서드  (0) 2024.01.07
파이썬의 str과 repr의 차이점  (0) 2024.01.01