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 |
최근댓글