일반적으로 리스트나 튜플의 원소에 접근하기 위해서는 인덱싱을 사용한다.
item = ('호박엿', '식혜')
first = item[0]
second = item[1]
print{first, '&', second)
>>>
호박엿 & 식혜
특히 튜플은 불변(immutable)성을 가지고 있어 인덱싱으로도 새 값을 대입해 튜플을 변경할 수 없다.
pair = ('약과', '호박엿')
pair[0] = '타래과'
>>>
Traceback ...
TypeError: 'tuple' object does not support item assignment
이 때 위와 같이 인덱싱을 통한 방법과 비슷하지만 다르게 작동하는 언패킹 구문이 있다.
item = ('호박엿' , '식혜')
first, second = item #언패킹
print(first, '&', second)
>>>
호박엿 & 식혜
언패킹은 튜플 인덱스를 사용하는 것보다 시각적인 잡음이 적다. 리스트, 시퀀스 이터러블(iterable) 안에 여러 계층으로 이터러블이 들어간 경우 등 다양한 패턴을 언패킹 구문에 사용할 수 있다.
favorite_snacks = {
'짭조름한 과자': ('프레즐', 100),
'달콤한 과자': ('쿠키', 180),
'채소': ('당근', 20),
}
((type1, (name1, cals1)),
(type2, (name2, cals2)),
(type3, (name3, cals3))) = favorite_snacks.items()
print(f'제일 좋아하는 {type1}는 {name1}, {cals1} 칼로리 입니다.')
print(f'제일 좋아하는 {type2}는 {name2}, {cals2} 칼로리 입니다.')
print(f'제일 좋아하는 {type3}는 {name3}, {cals3} 칼로리 입니다.')
>>>
제일 좋아하는 짭쪼름한 과자는 프레즐, 100 칼로리 입니다.
제일 좋아하는 달콤한 과자는 쿠키, 180 칼로리 입니다.
제일 좋아하는 채소는 당근, 20 칼로리 입니다.
def bubble_sort(a):
for _ in range(len(a)):
for i in range(1, len(a)):
if a[i] < a[i-1]:
a[i-1], a[i] = a[i], a[i-1] # 언패킹을 통한 맞바꾸기
for rank, (name, calories) in enumerate(snack, 1):
print(f'#{rank}: {name}은 {calories}칼로리입니다.')
>>>#1: 베이컨은 350칼로리입니다.
#2: 도넛은 240칼로리입니다.
#3: 머핀은 190칼로리입니다.