..

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 이라는 구문이 있다 언패킹 구문을 사용하면 한 문장 안에서 여러값을 대입할수 있다. 언패킹 문에 사용한 패턴은 튜플을 변경하려고 시도할때 사용한 구문 , 즉 파이썬이 허용하지 않았던 구문과 아주 비슷하지만, 두 구문은 매우 다르게 작동한디.

  1. 인덱스를 사용해서 각 값에 접근하는대신 이 튜플을 두 변수 이름으로 이뤄진 튜플에 대입할수 있다.
item = {'호박엿','식혜'}
first , second = item
print(first, '&',second)

>>>
호박엿 & 식혜

언패킹은 튜플 인덱스를 사용하는 것보다 시각적인 잡음이 적다. 리스트 , 시퀀스 , iterable 안에 여러 계층으로 iterable 이 들어간 경우 다양한 패턴을 언패킹 구문에 사용할수 있다.

iterable 객체 는 반복 가능한 객체라는 뜻으로 값을 차례대로 꺼낼 수 있는 객체를 뜻합니다.

언패킹 구문이 아닌 일반적인 상황에서는 인덱스 와 임시 변수를 사용해서 list 의 두위치에 있는 원소를 바꿀수 있다.

하지만 언패킹 구문을 사용한다면

a[i],a[i-1] = a[i-1],a[i] 

형식으로 두인덱스가 가리키는 원소를 서로 맞 바꿀수 있다.

이 구문이 가능한 이유는

  1. 위 식이 실행 될때 우항이 계산되고 그 결과값이 이름없는 튜플에 저장된다.
  2. 좌항에 있는 언패킹 패턴을 통해 임시 튜플에 있는 값이 좌항의 값에 저장된다.
  3. 이름없는 튜플은 조용히 사라진다.

또한 언패킹 문에서는 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}')

이런식의 루프가 필요할때는 이 방법이 파이썬 다운 방식이다 코드 가 더 짧고 이해하기도 쉽다. 일반적으로는 인덱스를 통해 무언가에 접근할 필요가 전혀 없다.

언패킹을 현명하게 사용하면 가능한 인덱스 사용을 피할수 있고 , 더 명확하고 파이썬 다운 코드를 사용할수 있다.