Home [Better Way #13] 슬라이싱보다는 나머지를 모두 잡아내는 언패킹을 사용하라
Post
Cancel

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

본문은 “파이썬 코딩의 기술 (Effective Python, 2판)”“Chapter 02. List and Dictionary”을 읽고 정리한 내용입니다.


별표 식 *

  • 리스트를 서로 겹치지 않게 여러 조각으로 나누는 경우, 별표 식(starred expression)을 통해 모든 값을 담는 언패킹을 할 수 있다.

    기본적인 언패킹 시에는 언패킹할 시퀀스의 길이를 미리 알고 있어야 한다는 한계점을 개선한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]
    car_ages_descending = sorted(car_ages, reverse=True)
    
    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)
    # 20 0 [19, 15, 9, 8, 7, 6, 4, 1]
    
    *others, second_youngest, youngest = car_ages_descending
    print(youngest, second_youngest, others)
    # 0 1 [20, 19, 15, 9, 8, 7, 6, 4]
    
  • 별표 식은 아무 위치에서나 사용할 수 있다.
  • 언패킹 대입에서 별표 식을 사용하려면 필수인 부분이 적어도 하나는 있어야 한다.
  • 한 수준의 언패킹 패턴에 별표 식을 두 개 이상 쓸 수 없다. (여러 계층으로 이뤄진 경우 제외)
  • 별표 식은 항상 list 인스턴스가 되며, 언패킹하는 시퀀스에 남는 원소가 없으면 빈 리스트가 된다.
    • 원소가 최소 N개 들어있다는 사실을 미리 아는 시퀀스를 처리할 때 유용하다.

      1
      2
      3
      4
      
      short_list = [1, 2]
      first, second, *rest = short_list
      print(first, second, rest)
      # 1 2 []
      
    • 한편, 결과 데이터가 모두 메모리에 들어갈 수 없는 경우, 메모리가 부족하여 프로그램이 멈출 수 있다.

  • 이터레이터의 경우에도 별표 식을 이용하여 값을 깔끔하게 처리할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    def generate_csv():
        yield ("날짜", "제조사", "모델", "연식", "가격")
        for _ in range(200):
            yield (...)
    
    it = generate_csv() # 이터레이터 선언
    header, *rows = it
    print('CSV 헤더:', header)
    print('행 수:', len(rows))
    
    # CSV 헤더: ('날짜', '제조사', '모델', '연식', '가격')
    # 행 수: 200
    
This post is licensed under CC BY 4.0 by the author.

[Better Way #12] 스트라이드와 슬라이스를 한 식에 함께 사용하지 말라

[Better Way #14] 복잡한 기준을 사용해 정렬할 때는 key 파라미터를 사용하라