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