일반적으로 리스트나 튜플의 원소에 접근하기 위해서는 인덱싱을 사용한다.
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칼로리입니다.