파이썬 코딩을 더 깔끔하게! #6

Dunno·2021년 7월 4일
0

Better Way 6. 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹하라

일반적으로 리스트나 튜플의 원소에 접근하기 위해서는 인덱싱을 사용한다.

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루프나 제너레이터 등의 대상인 리스트 원소 언패킹
for rank, (name, calories) in enumerate(snack, 1):
	print(f'#{rank}: {name}{calories}칼로리입니다.')

>>>#1: 베이컨은 350칼로리입니다.
   #2: 도넛은 240칼로리입니다.
   #3: 머핀은 190칼로리입니다.

기억해야 할 내용

  • 파이썬에는 언패킹이라는 문법이 존재한다.
  • 언패킹은 일반화돼 있어 모든 이터러블에 적용할 수 있고, 이터러블이 여러 계층으로 내포된 경우에도 언패킹을 적용할 수 있다.
  • 언패킹을 통해 시각적인 잡음을 줄이고 코드를 명확하게 만들 수 있다.

0개의 댓글