본문 바로가기

파이썬

패킹(packing)

0. 들어가며

packing은 여러개의 객체를 하나로 묶는 것. 
unpacking은 여러개의 객체를 묶어 놓은 것을 풀어내는 것임.
# 패킹 : test에 한꺼번에 1,2,3을 집어넣는다
test = 1,2,3

# a,b,c 변수에 test안에 묶여있던 값들을 풀어서 집어넣는다.
a,b,c = test

#결과
print(a, b, c)
>>> 1,2,3

피보나치 수열 등을 작성할 때 아래 처럼 swap(변수 바꾸기) 했는데, unpacking 과 유사하다는 느낌이 들었다.

a,b = b, a+b

 

용어 설명

  • 매개변수(Parameter) : 함수를 정의할 때 사용되는 변수
  • 인자(Argument): 실제로 함수가 호출될 때 입력되는 변수값
  • 위치인자 : 인자와 매개변수에 위치와 일치시키는 인자, 항상 키워드 인자보다 먼저 작성해야함
  • 키워드인자 : 매개변수에 이름으로 일치시키는 인자 

예시 

  • 매개변수는 args, kwargs
  • 인자는 print 함수로 출력된 func(1,2,3,4,5) func1(이름 ="베베", 성 = "김") 의 1,2,3,4,5 이름 ="베베", 성 = "김"
  • 위치인자 : 아래 코드의  1,2,3,4,5
  • 키워드인자 :  이름 ="베베", 성 = "김"
  • ex. func('py', b='thon') ’py’→위치인자, b=’thon’ → 키워드 인자
def func(*args): 
    print(args)
    print(type(args))


def func1(**kwargs): 
    print(kwargs)
    print(type(kwargs))


print(func(1,2,3,4,5))
print(func1(이름 ="베베", 성 = "김"))

#kewargs는 키워드 = 특정값 형태

 

# 결과값 
(1, 2, 3, 4, 5)
<class 'tuple'>
{'이름': '베베', '성': '김'}
<class 'dict'>

1. 패킹

위 예시 코드를 통해 알수 있듯이,

1) 함수에 반영된 매개변수(parameter)에 패킹을 할 수 있다.

2) 위치인자 패킹은  * 을 매개변수 앞에 붙이고

3) 키워드인자  패킹은 ** 을 매개변수 앞에 붙인다.

 

2. 패킹을 사용하는 이유

이렇게 함수의 매개변수에 패킹을 사용해주면, 매개변수 하나에 여러개의 값을 받을 수 있다.

예를 들어 합계 함수를 구할때 인자에 구체적으로 몇개의 값이 입력될지 알수 없을 수 있다.

이때 패킹을 활용하면 이를 해결할 수 있다.

또, 인수가 입력되지 않았을 때도 오류 없이 처리할 수 있다.

# 매개변수 a,b 두개 입력
def sum_test1(a,b):
    return a+b
    
# 3개의 인자를 입력하면 오류 발생
sum_test1(1,2,3) 

#매개변수 패킹 활용
def sum_test2(*args):
    result = 0
    for arg in args:
        result += arg
    return result
    
# 3개의 인자를 입력해도 오류 발생하지 않음
sum_test2(1,2,3)

# 인자를 아예 입력하지 않아도 오류 발생하지 않음
sum_test2()

 

3. 한개의 값을 받는 매개변수와 여러개의 값을 입력받는 매개변수에  활용

추가로 반드시 1개의 값이 입력되어야 하는 매개변수와 여러개의 값을 입력해야하는 매개변수를 구분해서 작성할 수 있다.

아래 코드에서 매개변수 name에는 1개의 값만 입력받고, animals는 *을 매개변수 이름 앞에 붙여 여러 값을 받을수 있게 되었다.

def animal_family(name,*animals):
    print("반려동물 보호자 : ", name)
    print("반려동물 : ", animals)
animal_family("사람이름", '강아지',' 고양이','토끼')

함수를 실제로 사용할 때, 사람이름을 먼저 입력받고 뒤에 동물들을 쭉 나열하여 입력했다.

눈치챈 사람도 있을 수 있겠지만, 동물은 몇마리를 입력 받을지 알수 없기때문에, 

함수를 정의할때 def animal_family(*animals, name) : 이라고 매개변수의 순서를 바꿔쓰면 오류가 발생한다.

인자를 animal_family( '강아지','고양이','토끼','사람이름') 라고 입력해도 컴퓨터는 어디까지가 animals인지 알수 없기 때문이다.

이는 아래 예시 코드를 통해서 확인 가능하다.

# 정상 작동
def test(a,*b):
    print(a)
    print(b)
test(1,2,3,4,5,6)

# 결과값
1
(2, 3, 4, 5, 6)

#오류 발생
def test(a,*b):
    print(a)
    print(b)
test(1,2,3,4,5,6)

#결과값 
test() missing 1 required keyword-only argument: 'b'