Unpacking 을 통한 대입
파이썬에는 불변의 값으로 순서쌍을 만들어낼수 있는 tuple
내장 타입이 있다.
snack_caloriees = {
'photato':140,
'popcorn':80,
'peanuts':190,
}
items = tuple(snack_calories.items())
print(items)
>>>
(('popcorn',140),('photato',80),('peanuts',190))
튜플에 있는 값은 숫자 인덱스를 사용해 접근할 수 있다. -> items[0]
튜플이 만들어진다면 인덱스를 통해 새 값을 대입해서 튜플을 변경할 수는 없다.
Unpacking
파이썬 에는 unpacking 이라는 구문이 있다 언패킹 구문을 사용하면 한 문장 안에서 여러값을 대입할수 있다. 언패킹 문에 사용한 패턴은 튜플을 변경하려고 시도할때 사용한 구문 , 즉 파이썬이 허용하지 않았던 구문과 아주 비슷하지만, 두 구문은 매우 다르게 작동한디.
- 인덱스를 사용해서 각 값에 접근하는대신 이 튜플을 두 변수 이름으로 이뤄진 튜플에 대입할수 있다.
item = {'호박엿','식혜'}
first , second = item
print(first, '&',second)
>>>
호박엿 & 식혜
언패킹은 튜플 인덱스를 사용하는 것보다 시각적인 잡음이 적다. 리스트 , 시퀀스 , iterable 안에 여러 계층으로 iterable 이 들어간 경우 다양한 패턴을 언패킹 구문에 사용할수 있다.
iterable 객체 는 반복 가능한 객체라는 뜻으로 값을 차례대로 꺼낼 수 있는 객체를 뜻합니다.
언패킹 구문이 아닌 일반적인 상황에서는 인덱스 와 임시 변수를 사용해서 list 의 두위치에 있는 원소를 바꿀수 있다.
하지만 언패킹 구문을 사용한다면
a[i],a[i-1] = a[i-1],a[i]
형식으로 두인덱스가 가리키는 원소를 서로 맞 바꿀수 있다.
이 구문이 가능한 이유는
- 위 식이 실행 될때 우항이 계산되고 그 결과값이 이름없는 튜플에 저장된다.
- 좌항에 있는 언패킹 패턴을 통해 임시 튜플에 있는 값이 좌항의 값에 저장된다.
- 이름없는 튜플은 조용히 사라진다.
또한 언패킹 문에서는 for 루프 혹은 그와 비슷한 다른 요소 의 대상인 리스트의 원소를 언패킹하는것이 있다. 비교를 위해 언패킹을 사용하지 않고 list 에 대해 이터레이션 해보자.
numbers = [('fist',1),('second',2),('third',3)]
for i in range(len(snacks)):
items = snacks[i]
str = items[0]
num = items[1]
print(f'{str} : {num}')
>>>
first : 1
second : 2
trhird : 3
위 구조는 잘 작동하지만 numbers 구조 깊숙한 곳에 있는 데이터를 인덱스로 찾을려면 코드가 길어진다.
위구조를 그대로 enumerate 내장 함수 와 언패킹 을 사용해서 똑같은 구조를 만들어보자
for (str,num) in enumerate(numbers):
print(f'{str} : {num}')
이런식의 루프가 필요할때는 이 방법이 파이썬 다운 방식이다 코드 가 더 짧고 이해하기도 쉽다. 일반적으로는 인덱스를 통해 무언가에 접근할 필요가 전혀 없다.
언패킹을 현명하게 사용하면 가능한 인덱스 사용을 피할수 있고 , 더 명확하고 파이썬 다운 코드를 사용할수 있다.