packing과 unpacking

  1. packing

    • tuple로 선언하지 않았음
    • type은 tuple로 나옴 = packing이 되었음
      1
      2
      3
      container = 1, 2, 3, 4, 5
      type(container)
      >> tuple
  2. unpacking

    • 위 container 변수를 unpacking 함
    • 변수 앞에 *를 붙여주면 묶음

      1
      2
      3
      4
      5
      6
      7
      a, b, *c = container
      a
      >> 1
      b
      >> 2
      c
      >> [3, 4, 5]
    • dictionary에서 items()도 unpacking

      1
      2
      3
      4
      dic = {'a' : 1, 'b' : 2}
      for k, v in dic.items():
      print(k,v, end = ' ')
      >> a 1 b 2
  3. packing과 unpacking 활용

    • 함수에서 매개변수 앞에 *를 붙여주면 가변인자로 받을 수 있다.

      1
      2
      3
      4
      5
      def sum_int(*args):  # 함수에서 가변인자 받는 방법
      s = 0
      for arg in args:
      s += arg
      return s
    • 아래와 같이 1, 2, 3, 4, 5의 가변인자가 들어오면 tuple로 packing이 됨

      1
      2
      sum_int(1, 2, 3, 4, 5)
      >> 15
    • 아래와 같이 list 형태로 가변인자를 넣게 되면 하나의 데이터로 인식하여 에러 발생

      1
      2
      3
      li = [1, 2, 3, 4]
      sum_int(li)
      >> TypeError: unsupported operand type(s) for +=: 'int' and 'list'
    • 따라서 *를 붙여서 다시 unpacking하여 사용

      1
      2
      3
      # *를 붙여서 다시 unpacking하여 사용
      sum_int(*li)
      >> 10
    • 아래와 같은 매개변수의 형태로 모든 인자를 다 받을 수 있다.

      • args : non keyword arguments
      • kwargs : keyword arguments
    • kwargs는 dictionary를 packing할 때 사용한다.(keyword가 존재)
    • 함수를 정의할 때, *args, **kwargs는 가변인자를 받겠다는 의미이다.

      1
      2
      3
      4
      5
      6
      7
      def sum_int(*args, **kwargs):
      print(args)
      print(kwargs)

      sum_int(1, 2, 3, age = 100, weight = 100)
      >> (1, 2, 3)
      {'age': 100, 'weight': 100}
    • keyword가 없는 인자는 앞에, keyword가 있는 인자는 뒤에 위치해야 한다.

    • keyword 인자 뒤에 keyword가 없는 인자가 존재하면 에러가 발생한다.

      1
      2
      sum_int(1, 2, 3, age = 100, weight = 100, 4)
      >> SyntaxError: positional argument follows keyword argument
    • 함수를 호출하는 입장에서의 *, **는 unpacking을 의미한다.

      1
      2
      3
      sum_int(*li, **dic)
      >> (1, 2, 3, 4)
      {'a': 1, 'b': 2}
Share