python cookbook -1 (Unpack a Sequence, star expression)

2 minute read

1.1 Unpacking a Sequence

into Separate Variables

  • 간단한 대입 연산 (=) 으로 튜플이나 리스트 등등의 Sequence의 값들을 변수에 각각 넣을 수 있다

    a = (1,2,("hello!", 3)
    x,y,z = a
           
    print(x,y) #1,2
    print(z)  # (hello! 3)
    
    listA= ['python', (2019, 12, 31)]
    subject, year, month, day = listA
      
    print(year, month, day) # 2019 12 31
    
    • 넘겨 받는 변수의 개수가 맞지 않으면 에러 발생
  • 문자열도 이렇게 받을 수 있다!!

    greeting = "hello"
    a,b,c,d,e = greeting
      
    print(a,b,c,d,e)  # h e l l o
    
  • 특정 값이 필요 없으면 변수명을 _ 로 처리해주면 된다

    name = "chaen"
    x,y,_,_,z = name
    print(x,y,z)   # c h n
    

from Iterables of Arbitrary Length

  • 받을 값의 길이를 모른다면??? 변수 개수를 하나하나 정해줄 수 없으니 –> Star Expression 사용하기

  • Star Expression * **

    use * operator to unpack the arguments out of a list or tuple 출처

    • Unpack을 할 때 사용할 수 있다!! (리스트 반환)
    • 함수의 가변 매개변수를 공부할 때 봤던 개념인 듯
    def drop_first_last(grades) :
        first, *middle, last = grades
        return print(middle)
      
    grades = [10, 20, 30, 40]
    drop_first_last(grades)  # [20 30]
    # 중간값인 20, 30 만 출력된다 (미칭!)
    
  • 한 줄에 한 번(?)만 사용할 수 있다 a, *b, *c = (1,2,3) 하면 에러남

  • starred expression 위치에 따른 변화!!

    a, b, *c = [1,2,3,4,5]
    print(a,b,c)  # 1 2 [3 4 5]
      
    a, *b, c = [1,2,3,4,5]
    print(a,c,c)  # 1 [2 3 4] 5
      
    *a, b, c = [1,2,3,4,5]
    print(a,b,c)  # [1 2 3] 4 5
    
    • 만약 받을 변수의 개수가 더 많으면 값은 우선 일반 변수에 할당되고 starred 는 그냥 빈 리스트를 반환

      a, b, *c = (1 2)
      print(a,b,c)  # 1 2 []
          
      a, *b, c = (1 2)
      print(a,b,c)  # 1 [] 2
          
      *a, b, c = (1 2) 
      print(a,b,c)  # [] 1 2
      

starred expression을 사용하면 좋을 때!

  • A와 B의 특성을 가진 값들이 서로 섞여 있는데 서로 다른 작업을 해줘야 할 때! –» A와 B의 공통 부분을 추출해서 값들을 크게 둘로 분류한 뒤에 원하는 작업을 해줄 수 있음

    student = [
     ('math', 100, 95),
     ('eng', 'nice', 'great'),
     ('math', 42, 63),
     ('eng', 'bad', 'not good')
    ]
      
    def do_math(*args) :
        print(sum(args)//2)
    def do_eng(s1, s2) :
        print(s1 + s2)
          
    for tag, *args in student :
        if tag == 'math' : do_math(*args)
        elif tag == 'eng' : do_eng(*args)
    
    • student 값들의 공통부분인 ‘math’와 ‘eng’를 기준으로 분류한 뒤 다르게 처리
  • 문자열 처리할 때도 유용함! split()와 함께

    line = 'ychae:%:Unprevileged User:/ychae/python:/src/bin'
      
    userName, *field, homdir, sh = line.split(':')
    print(userName, field, homdir, sh)
    # ychae ['%', 'Unprevileged User'] /ychae/python /src/bin
    

Comments