개발자 블로그
[윤성우의 열혈 파이썬 중급편] - 7. 패킹과 언패킹 본문
튜플의 패킹과 언패킹
튜플로 값을 묶는 행위를 가리켜 '튜플 패킹'이라 하고 반대로 튜플로 묶여 있는 값들을 풀어내는 행위를 '튜플 언패킹'이라 한다.
- 튜플 패킹 하나 이상의 값을 튜플로 묶는 행위
- 튜플 언패킹 튜플에 묶여 있는 값들을 풀어내는 행위
예를 들어 봐보자! 먼저, 튜플의 패킹은 ()로 값들을 묶는 방법이 있고 그냥 소괄호 없이도 패킹이 가능하다!
반대로 언패킹을 진행할 때는 패킹 된 값의 수와 변수의 수를 갖게하여 할당해주면 된다.
그리고 언패킹 과정에서 *을 사용하여 둘 이상의 값을 리스트로 묶어서 하나의 변수에 저장하는 것도 가능!!
이렇듯, 튜플이 아닌 리스트로 묶인다는 사실을 기억하자. 현재는 맨 끝 값만 *을 사용하여 값을 묶었지만 가운데, 맨 앞 상관없이 묶을 수 있다는 것도 기억해야한다! 중요한건 변수의 수를 맞춰야한다는 사실! 마지막으로 리스트도 언패킹이 같은 방식으로 가능하다!
함수 호출과 반환 과정에서의 패킹, 언패킹
소괄호가 생략되도 튜플 패킹이 이루어짐
반환되는 값을 언패킹하여 *를 통해 뒤에 값들을 리스트 저장할 수도 있음!
매개변수 앞에 *가 오면 나머지 값들을 튜플로 묶어서 저장한다는 의미!
반면 '함수를 호출할 때 *가 사용되면' 이는 튜플 언패킹으로 이어진다. 이렇듯 *는 사용되는 위치에 따라 패킹을 의미하기도 언패킹을 의미하기도 한다! 헷갈리지 않게 잘 활용하자! 물론 리스트도 동일하게 전달이 가능하다!
정리하면, 함수를 호출할 때 *는 언패킹, 함수를 정의할 때 * 패킹!
그리고 이중 튜플의 경우 언패킹을 할 때 변수 선언을 같은 구조로 해준다면 각 해당 변수에 맞게 값이 잘 들어가는 것을 볼 수 있다. 또한, 필요한 값이 아닌 변수는 관례적으로 '_' 를 대신하여 사용하기도 한다!
마지막으로 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를 함께 사용하는 것은 지양하도록 하자!
'파이썬 > 윤성우의 열혈 파이썬 중급편' 카테고리의 다른 글
[윤성우의 열혈 파이썬 중급편] - 9. dict & defaultdict & OrderedDict (0) | 2022.04.29 |
---|---|
[윤성우의 열혈 파이썬 중급편] - 8. dict의 생성과 looping 기술 (0) | 2022.04.28 |
[윤성우의 열혈 파이썬 중급편] - 6. generator 함수와 표현식 (0) | 2022.04.27 |
[윤성우의 열혈 파이썬 중급편] - 5. map과 filter 그리고 리스트 컴프리헨션 (0) | 2022.04.27 |
[윤성우의 열혈 파이썬 중급편] - 4. Iterable 객체와 Iterator 객체 (0) | 2022.04.26 |