1. 패킹과 언패킹 

 - 튜플 패킹(tuple packing)

      : 튜플로 값을 묶는 행위 

 - 튜플 언패킹(tuple unpacking)

      : 튜플로 묶여 있는 값들을 풀어내는 행위 

 

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

 

 - 예를 들어, 삼각형의 정보(밑변과 높이 정보) 튜플로 묶은 것이 튜플 패킹

 

- 또한, 우리에게 익숙한 튜플 패킹 방법 

 

- 튜플 언패킹 예제 

- 주의할 점 : 튜플에 저장된 값의 수와 이를 저장할 변수의 수가 일치해야 함 

 

- 언패킹 과정에서 둘 이상의 값을 리스트로 묶어서 하나의 변수에 저장하는 것도 가능함

- 둘 이상의 값을 리스트를 묶을 때 *를 사용함 

- 튜플이 아닌 리스트로 묶었음 

 

- 뒤쪽 값들만 묶을 수 있는 것이 아니라 중간의 값, 처음 값도 묶을 수 있음 

  

 

-  물론 언패킹은 튜플 말고 리스트를 대상으로 동일하게 작용함 

 

2. 함수 호출 및 반환 과정에서의 패킹과 언패킹

 - 패킹과 언패킹은 함수의 호출과 반환 과정에서도 일어남

 

- return문 구상

- 튜플의 패킹에서 소괄호는 생략이 가능함 

- 즉, 패킹되어 반환됨 

 

- 따라서 함수가 반환하는 값을 다음과 같이 저장할 수 있음

 

 

 - show_nums(n1, n2, *other) : 세 번째 이후 값들은 튜플로 묶여 other에 전달됨 

 - 매개 변수 앞에 *가 오는 것 : 나머지 값들은 튜플로 묶여서 이 변수에 저장하겠음 

 

 

 - 따라서 다음과 같이 전달되는 값의 수에 상관없이 모든 정수의 합을 계산해서 반환하는 함수도 만들 수 있음 

 - sum(*nums) : 전달되는 모든 값들을 하나의 튜플로 묶어서 nums에 저장 

 

 - 그러나 위처럼 함수를 호출할 때 *를 사용하면 튜플 언패킹 기능이 된다.

 - 따라서 *는 사용되는 위치에 따라서 패킹을 의미하기도 하고, 언패킹을 의미하기도 함 

 

 - show_man(*p) : 리스트를 전달하는데 *을 붙인 상황 

 - 위와 같이 언패킹은 리스트를 대상으로 작동함

 

- 튜플 안에 또 다른 튜플이 존재하는 경우의 언패킹 방법

 - t = (1, 2, (3, 4)) : 튜플 안에 튜플이 있는 경우 

 - a, b, (c, d) = t : 튜플 안의 값의 구조와 동일한 형태로 변수를 선언 

 - 즉 1, 2, (3, 4) 처럼 네 개의 변수에 나눠서 담을 땐, a, b, (c, d) 와 같이 동일한 형태로 변수를 선언해서 언패킹 해야함

 

p = 'Hong', (32m, 178), '010-1234-56xx', 'Korea'

 - 이름과 키 정보만 필요하다고 가정했을 때, 연패키을 진행한 다음에 이름과 키 정보만 사용하면 됨 

 - 튜플에 소괄호를 생략함 

 - 그런데 위처럼 키 정보를 얻기 위해 불필요한 정보까지 변수에 담는 것은 번거로움 

 

 - 위처럼 이름과 키 정보만 뽑아내는 것이 더 편리함 

 - 불필요한 정보가 있는 위치에 _을 대신 넣었음 : 여기서 사용된 _도 변수임 

 - 다만, 불필요한 정보라는 것을 의미하기 위해서 변수의 이름으로 잘 쓰지 않는 _를 그 위치에 넣어 둔 것임 

 - 이것도 일종의 관례임!

 

3. for 루프에서의 언패킹 

 - for루프에서 제일 처음 변수 n과 h에 저장되는 값 

for n, h in ps ('Lee', 172)에서 'Lee'
for n, h in ps ('Lee', 172에서 172

 

 - 두 번째 튜플의 값이 각각 n과 h에 저장되어 for 루프의 두 번째 반복이 진행됨 

for n, h in ps ('Jung', 182)에서 'Jung'
for n, h in ps ('Jung', 182)에서 182

 

 - 이러한 형태의 언패킹은 리스트를 대상으로도 동일하게 작용함 

 

+ Recent posts