[Python] 9. 튜플 패킹 & 언패킹, 네임드 튜플
본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.
9-1. 패킹과 언패킹
튜플 패킹: 하나 이상의 값을 튜플로 묶는 행위
tpl_one = (12, 15)
tpl_two = 12, 15
tpl_one
tpl_two
(결과) (12, 15)
(12, 15)
투플 언패킹: 튜플에 묶여 있는 값들을 풀어내는 행위
tpl_three = (23, 12)
fn, sn = tpl_three
print(fn, sn)
(결과) 23 12
언패킹 할 때 다음과 같이 리스트로 묶어서 하나의 변수에 저장할 수 있다.
nums = (1, 2, 3, 4, 5) # 튜플 뿐만 아니라, 리스트 대상으로도 동일하게 동작한다!
n1, n2, *others1 = nums
first, *others2, last = nums
*others3, n3, n4 = nums
print(n1, n2, others1)
print(first, others2, last)
print(others3, n3, n4)
(결과) 1 2 [3, 4, 5]
1 [2, 3, 4] 5
[1, 2, 3] 4 5
9-2. 함수 호출 및 반환 과정에서의 패킹과 언패킹
긴 말 없이 코드로 보자!
def ret_nums():
return 1, 2, 3, 4, 5
nums = ret_nums()
n, *others = ret_nums()
print(nums)
print(n, others)
(결과) (1, 2, 3, 4, 5)
1 [2, 3, 4, 5]
참고로 함수 선언시, 매개변수에 *를 적용할 수 있다
def show_nums(n1, n2, *others):
print(n1, n2, others, sep = ', ')
p = ('yoon', 22, 180, 'hi')
show_nums(1, 2, 3, 4, 5)
show_nums(*p)
(결과) 1, 2, (3, 4, 5)
yoon, 22, (180, 'hi')
튜플을 언패킹 할때, 여러가지 튜플 요소 중 우리가 필요로 하는 요소만 출력하고 싶을 때가 있을 것이다.
p = 'Yang', (33, 182), '010-xxxx-aaaa', 'Korea'
f_name, (age, height), ph, nat = p
print(f_name, height)
(결과) Yang 182
이 때 불필요한 정보까지 변수에 담는건 번거로운 일이니, 다음 코드를 활용해서 불필요한 정보를 저장할 필요 없이 필요한 정보만 쏙쏙 뽑아보자.
p = 'Yang', (33, 182), '010-xxxx-aaaa', 'Korea'
f_name, (_, height), _, _ = p
print(f_name, height)
(결과) Yang 182
9-3. for 루프에서의 언패킹
ps = [('Won', 182), ('Joon', 180), ('Young', 162)]
# ps = (['Won', 182], ['Joon', 180], ['Young', 162]) # 리스트 안에 튜플로 감싼 요소들도 가능!
for n, h in ps:
print(n, h, sep = ', ')
(결과) Won, 182
Joon, 180
Young, 162
9-4. 네임드 튜플의 이해와 작성
다음 코드의 12와 15는 무엇을 의미하는 걸까?
tri = (12, 15)
이건 코드 작성자가 언급을 안하면 모른다. 사실 이 책의 저자는 저게 삼각형 밑변과 높이라는 정보를 튜플에 새기고 싶어했다.
그렇다면, 저기에 삼각형 밑변과 높이라는 정보를 어떻게 줄 수 있을까?
바로 ‘네임드 튜플’을 활용해서 해당 정보를 줄 수 있다!
from collections import namedtuple
Tri = namedtuple('Triangle', ['bottom', 'height'])
t = Tri(12, 15)
print(t[0], t[1])
print(t.bottom, t.height)
(결과) 12 15
12 15 `Tri = namedtuple('Triangle', ['bottom', 'height'])` 코드 부분을 주목하자! <br/> 해당 코드는 Triangle 이라는 이름의 튜플 성격을 갖는 클래스를 만들기 위한 함수 호출이다! 그리고 첫번째 값의 이름은 bottom, 두번째 값의 이름은 height로 지정하게 된다.
그럼 해당 튜플의 밑변 값을 바꾸고 싶은데, 가능할까? 튜플인데?
t[0] = 3
(결과) Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Triangle' object does not support item assignment
9-5. 네임드 튜플 언패킹
네임드 튜플도 일반 튜플과 동일하게 언패킹 가능하다.
def show(n1, n2):
print(n1, n2)
t = Tri(12, 15)
a, b = t
print(a, b)
show(*t)
(결과) 12 15
12 15
Leave a comment