13. 슬라이싱보다는 나머지를 모두 잡아내는 언패킹을 사용하라

 

car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]

car_ages_desc = sorted(car_ages, reverse=True)

oldest , second_oldest = car_ages_desc

 

언패킹하 시퀀스의 길이를 미리 알고 있어야함

 

car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]

car_ages_desc = sorted(car_ages, reverse=True)

# oldest , second_oldest = car_ages_desc

olest = car_ages_desc[0]
second_oldest = car_ages_desc[1]
others = car_ages_desc[2:]
print(olest, second_oldest, others)

 

잘 작동하지만 문제가 있다.

 

모든 인덱스와 슬라이스로 인해 시각적 잡음이 발생하여 시퀀스의 원소를 여러 하위 집합으로 나누면 1 차이 나는 인덱스로 인한 오류(off-by-one error)가 발생하기 쉽다

 

별표식을 사용해 모든 값을 담는 언패킹을 할 수 있도록 파이썬은 지원을 한다

 

언패킹 패턴의 달느 부분에 들어가지 못하는 몯느 값을 별이 붙은 부분에 다 담을 수 있다.

 

car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]

car_ages_desc = sorted(car_ages, reverse=True)
olest, second_oldest, *others = car_ages_desc
print(olest, second_oldest, others)

위의 결과와 동일하게 작동함을 알 수 있다.

 

오히려 더 짧고 읽기 쉽고 오류 발생 가능성도 낮다.

 

 

별표식을 다른 위치에 쓸 수도 있다.

따라서 꼭 언패킹해야만 하는 값 외에 여분의 슬라이스가 하나 필요한 경우, 나머지를 모두 잡아내는 기능의 이점을 살릴 수 있다.

 

하지만!!

별 표식이 포함된 언패킹 대입을 처리하려면 필수인 부분이 적어도 하나는 있어야한다.

 

또한,

한 수준의 언패킹 패턴에 별표 식을 두 개 이상 쓸 수 도 없다.

 

하지만 여러 계층으로 이뤄진 구조를 언패킹할 때는 서로 다른 부분에 포함되는 한, 여럿 사용해도 된다.

 

 

그러나

함수가 여러 값을 반환 하는 경우 절대로 네 값 이상을 언패킹하면 안되지만 별표 식을 언패킹 대입에 사용하면 가능하다

car_inventory = {
    '시내': ('그랜저', '아반떼', '티코'),
    '공항': ('제네시스', '소나타', 'K5', '엑센트')
}

((loc1, (best1, *rest1)),
 (loc2, (best2, *rest2))) = car_inventory.items()
 
print(f'{loc1} 최고는 {best1}, 나머지는 {len(rest1)} 종')
print(f'{loc2} 최고는 {best2}, 나머지는 {len(rest2)} 종')

 

별표식은 항상 list 인스턴스가 된다.

언패킹하는 시퀀스에 남는 원소가 없으면 별표식은 빈 리스트가 된다.

이런 특징을 살려 원소가 최소 N개 들어있다는 사실을 미리 아는 시퀀스를 처리할 때 유용하다.

 

it = iter(range(1,3))
frist, second, = it
print(f'{frist} & {second}')

 

본 블로그는 [파이썬 코딩의 기술] 서적을 참고하여 작성하였습니다.

 

반응형

'SW ENGINEERING > Python' 카테고리의 다른 글

가상환경 구축  (0) 2021.08.26
파이썬 코딩의 기술TIP 14일차  (0) 2021.08.16
파이썬 코딩의 기술TIP 12일차  (0) 2021.08.02
파이썬 코딩의 기술TIP 11일차  (0) 2021.07.02
파이썬 코딩의 기술TIP 10일차  (0) 2021.06.18
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기