728x90


튜플 패킹과 언패킹

 

1. 튜플 패킹(packing) : 튜플로 값을 묶는 행위. 소괄호( )를 생략할 수 있다.

2. 튜플 언패킹(unpacking) : 튜플로 저장된 값을 꺼내는 행위.
언패킹 시 튜플에 저장된 값의 수와 튜플 내 값을 받아 줄 변수의 수가 일치해야한다. (불일치 시 에러)
튜플을 언패킹할 때 여러 값들을 하나의 변수에 묶기 위해서는 *others를 사용하며, others 값들은 리스트에 담긴다.
설명을 튜플 언패킹으로 한정지어서 했지만 '리스트' 또한 언패킹의 대상이 될 수 있음

# 튜플 언팩킹 예시
# 튜플에 저장된 값의 수와 이를 저장할 변수의 수가 일치해야하며,
# 언패킹된 각각의 데이터는 데이터에 맞는 데이터타입을 갖는다.

tuple_test = (1, "test", 3.12)
t1, t2, t3 = tuple_test
print(t1)  # <class 'int'>
print(t2)  # <class 'str'>
print(t3)  # <class 'float'>

# *others를 이용한 튜플/리스트 언팩킹
nums_li = list(range(1, 10))
nums_tup = tuple(range(1, 10))

n1, n2, *others = nums_li
nt1, *others, nt2 = nums_tup

print(others)  # [3, 4, 5, 6, 7, 8, 9]
print(nt1)  # 1

 

3. 함수 파라미터와 패킹
함수에 파라미터가 여러개 전달 될 때, *others로 파라미터를 받는다면 파라미터가 지정된 값들 외 나머지는 튜플로 묶어서 others 변수에 저장된다.
전달되는 값들을 모두 하나의 튜플로 묶어서 함수에 전달하고 싶을 때는 파라미터에 *prameter를 사용한다.

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

# 함수에 파라미터가 여러개 전달 될 때
def show_nums(n1, n2, *others):
    print(n1, n2, others, sep=", ")

    
print(show_nums(1, 2, 3, 4, 5, 6))  # 1, 2, (3, 4, 5, 6)

# 전달되는 값들을 모두 하나의 튜플로 묶어서 함수에 전달하고 싶을 때
def sum(*parameter):
    s = 0
    for i in parameter:
        s += i
    return s


print(sum(1, 2, 3, 4, 5))  # 15

네임드 튜플

 

튜플에 저장된 값들에 이름을 붙혀 값들이 무엇을 의미하는지 알 수 있게 만든 튜플
* collactions 모듈의 namedtuple을 import 해야함 (from collections import namedtuple)

 

학생 정보를 입력하는 네임드 튜플을 만든 예시다. 여기서 네임드 튜플을 확일 할 수 있는데, student1[0]처럼 튜플에 위치한 자리로 학생 정보를 출력하는 방법과, student1.name으로 정보가 의미하는 내용을 입력하면서 찾을 수 있다는 것이다.
추가적으로 student_info = namedtuple('student_info', ['name', 'number']) 에서 첫번 째 student_info는 오류가 발생했을 시 오류의 원인을 찾는데 사용하며, 네임드 튜플이 의미하는 것이 무엇인지 명확하게 하기 위해서 두번째 오는 student_info와 이름이 같게 코딩한다.

 

from collections import namedtuple
student_info = namedtuple('student_info', ['name', 'number'])

student1 = student_info('Park', 202112341234)
print('name : ', student1[0], '/ number : ', student1[1])  # name :  Park / number :  202112341234
print('name : ', student1.name, '/ number : ', student1.number)  # name :  Park / number :  202112341234

 

 


 

728x90

+ Recent posts