언패킹

매일 공부(ML)·2022년 6월 6일
0

이어드림

목록 보기
67/146

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

기본 언패킹의 한계점

  • 언패킹할 시퀀스의 길이를 미리 알아야한다.

  • 기본 언패킹으로 리스트 맨 앞에서 원소를 두 개 가져오면 실행 시점에서 예외가 발생한다.

car_ages = [0,9,4,8,7,20,19,1,6,15]
car_ages_descending = sorted(car_ages, reverse =True)
oldest, second_oldest = car_ages_descending
#Traceback..
#ValueError : too many values to unpack(expected2)

해결

  • 시각적 잡음이 많다.
  • 1차이 나는 인덱스로 인한 오류를 만들기 쉽다.
  • 한 줄에서 범위를 변경했는데 모르고 못 고치면 결과 잘못 혹은 예외가 발생한다
oldest = car_ages_descending[0]
second_oldest = car_ages_descending[1]
others = car_ages_descending[2:]
print(oldest, second_oldest, others)
#20 19 [15,9,8,7,6,4,1,0]

권장 해결방식

  • 별표 식(starred expression)사용하라

  • 모든 값을 담는 언패킹

  • 언패킹 패턴의 다른 부분에 들어가지 못하는 모든 값을 별이 붙은 부분에 다 담다.

  • 인덱스나 슬라이싱을 사용하지 않고 앞의 코드와 실행은 같다.

  • 코드가 짧고 읽기가 쉽다.

  • 여러 줄 사이에 인덱스 경계 값이 어긋나서 오류X

oldest, second_oldest, *others =car_ages_descending
print(oldest, second_oldest, others)
#20 19 [15,9,8,7,6,4,1,0]

별표 식을 다른 위치에 쓴다.

  • 꼭 언패킹해야한 하는 값 이외에 여분의 슬라이스도 해결
  • 나머지 모두를 잡아내는 기능의 이점 살린다.

oldest, *others, youngest = car_ages_descending
print(oldest, youngest, others)

*others, second_youngest, youngest = car_ages_descending
print(youngest, seconnd_youngest, others)
#20 0 [19,15,9,8,7,6,4,1]
#0 1 [20,19,15,9,8,7,6,4]


주의할 점

  • 메모리를 사용 많이 하기에 프로그램을 멈출 수 있으니 결과 데이터가 모두 메모리에 들어갈 수 있는 확신이 있을 때만 사용한다

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

  • 문법에러가 발생한다.

  • 별표 식만 사용해서 언패킹할 수 없다.

*others = car_ages_descending

#SyntaxError
한 수준의 언패킹 패턴에 별표 식을 두 개이상 쓸 수 없다
first, *middle, *second_middle, last = [1,2,3,4]

#SyntaxError

장점

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

  • 언패킹하는 시퀀스에 남는 원소가 없다면

  • 별표식 부분은 빈 리스트가 된다.

  • 이로 인해, 최소N개 들어있다느 사실을 알 수 있다.

short_list = [1,2]
first, second, *rest = short_list
print(first, second, rest)
#1 2 []
이터레이터의 값을 깔끔하게 가져오나
def generate_csv():
    yield ('날짜', '제조사', '모델', '연식','가격')

it = generate_csv()
header, *rows =it
print('CSV 헤더:', header)
print('행 수:', len(rows))

#CSV 헤더: ('날짜','제조사','모델','연식','가격')
#행 수:200
profile
성장을 도울 아카이빙 블로그

0개의 댓글