개발자 블로그

[윤성우의 열혈 파이썬 중급편] - 7. 패킹과 언패킹 본문

파이썬/윤성우의 열혈 파이썬 중급편

[윤성우의 열혈 파이썬 중급편] - 7. 패킹과 언패킹

hayongwoon 2022. 4. 28. 15:20

튜플의 패킹과 언패킹

튜플로 값을 묶는 행위를 가리켜 '튜플 패킹'이라 하고 반대로 튜플로 묶여 있는 값들을 풀어내는 행위를 '튜플 언패킹'이라 한다.

  • 튜플 패킹        하나 이상의 값을 튜플로 묶는 행위
  • 튜플 언패킹     튜플에 묶여 있는 값들을 풀어내는 행위

예를 들어 봐보자! 먼저, 튜플의 패킹은 ()로 값들을 묶는 방법이 있고 그냥 소괄호 없이도 패킹이 가능하다!

튜플 패킹

​반대로 언패킹을 진행할 때는 패킹 된 값의 수와 변수의 수를 갖게하여 할당해주면 된다.

튜플 언패킹

그리고 언패킹 과정에서 *을 사용하여 둘 이상의 값을 리스트로 묶어서 하나의 변수에 저장하는 것도 가능!!

둘 이상의 값을 리스트로 묶을 때

이렇듯, 튜플이 아닌 리스트로 묶인다는 사실을 기억하자. 현재는 맨 끝 값만 *을 사용하여 값을 묶었지만 가운데, 맨 앞 상관없이 묶을 수 있다는 것도 기억해야한다! 중요한건 변수의 수를 맞춰야한다는 사실! 마지막으로 리스트도 언패킹이 같은 방식으로 가능하다!

 

 

함수 호출과 반환 과정에서의 패킹, 언패킹

소괄호가 생략되도 튜플 패킹이 이루어짐

반환되는 값을 언패킹하여 *를 통해 뒤에 값들을 리스트 저장할 수도 있음!

매개변수 앞에 *가 오면 나머지 값들을 튜플로 묶어서 저장한다는 의미!

 

반면 '함수를 호출할 때 *가 사용되면' 이는 튜플 언패킹으로 이어진다. 이렇듯 *는 사용되는 위치에 따라 패킹을 의미하기도 언패킹을 의미하기도 한다! 헷갈리지 않게 잘 활용하자! 물론 리스트도 동일하게 전달이 가능하다!

정리하면, 함수를 호출할 때 *는 언패킹, 함수를 정의할 때 * 패킹!

 

그리고 이중 튜플의 경우 언패킹을 할 때 변수 선언을 같은 구조로 해준다면 각 해당 변수에 맞게 값이 잘 들어가는 것을 볼 수 있다. 또한, 필요한 값이 아닌 변수는 관례적으로 '_' 를 대신하여 사용하기도 한다!

 

마지막으로 for loop에서의 언패킹 예시

 

 

함수 호출과 매개변수 선언에 있어서 *와 **의 사용 규칙

  • func(*iterable).                  # iterable 객체를 전달하면서 *붙여 함수를 호출 할 때
  • func(**dict)                        # dict 객체를 전달하면서 **을 붙여 함수를 호출 할 때
  • def func(*args).                 # 함수를 정의하면서 매개변수 args에 *를 붙일 때
  • def func(**args)                 # 함수를 정의하면서 매개변수 args에 **를 붙일 때 

 

iterable 객체와 매개변수 - 함수 호출할 때! 언패킹!

먼저 앞에 두 가지에 대해 설명하면 이 둘은 객체를 전달하는 과정에서 언패킹을 하는 과정이라고 생각하면 된다.

  • func(*iterable).                  # 리스트, 튜플, 문자열을 풀어서 전달
  • func(**dict)                        # 딕셔너리 값을 풀어서 전달, *dict는 키 값이 매개변수로 **dict는 벨류 값이 매개변수로 전달!

참고로 뷰 객체도 iterable 객체이므로 *d.items()의 경우 똑같이 리스트에 *을 붙인 것과 동일하다!

 

 

딕셔너리와 매개변수 - 함수를 정의할 때! 패킹!

  • def func(*args).                 # 값들이 튜플로 묶여서 args에 전달
  • def func(**args)                 #전달 되는 내용이 딕셔너리로 묶여서 args에 전달

1 예시) func(1,2,3) -> 매개변수가 (1,2,3)과 같이 튜플로 패킹되어 전달!

2 예시) func(a=1,b=2) -> 매개변수가 {'a':1, 'b':2}로 딕셔너리로 패킹되어 전달!

 

#주의 : 두 가지를 함께 사용하여 함수를 정의할 수 있지만 그럴 경우 값을 해석하는 데 어려움이 있을 수 있다. 그러므로 *args, **args를 함께 사용하는 것은 지양하도록 하자!