Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
10-11 00:15
Archives
Today
Total
관리 메뉴

Developer_Neo

[python] 네임드 튜플 본문

프로그래밍/Python

[python] 네임드 튜플

_Neo_ 2022. 1. 19. 11:39
반응형

네임드 튜플

 

왜?

tri_one = (12,15)
print(tri_one)
(12, 15)

위의 코드를 보면

우리는 그냥 아 12와 15를 저장해둔 변수구나라고 생각을 한다

하지만 코드를 쓴 사람의 의도는 삼각형을 나타내는 거였고 각각 12 15는 밑변과 높이를 뜻하는 정보였다.

이렇게 됬을때 서로의 소통적이 문제가 발생할 수 있다.

그래서 쓰는 것이 네임드 튜플이다.

 

추가적으로 파이썬에서는 클래스에 대한 부분을 따로 작성하는 부분으로 네임드튜플로 했지만 3.7버전이후부터는

@dataclass라는 어노테이션을 이용해서 만들 수 있게 되어 네임드 튜플을 사용빈도가 줄어들었다.

from dataclasses import dataclass

@dataclass
class User:
    id: int
    name: str
    admin: bool = False

다시 네임드튜플로 돌아가자.

 

1. 선언해야하는 것

from collections import namedtuple

 

2. 형식

변수 = namedtuple('생성하고 싶은 클래스의 이름', ['1번째 인수 이름','2번째 인수 이름'])
변수 = namedtuple('생성하고 싶은 클래스의 이름', '1번째 인수 이름 2번째 인수 이름')

 2-1 예

Tri = namedtuple('Triangle', ['bottom','height'])
Tri = namedtuple('Triangle', 'bottom height')

3. 접근 방법

t=Tri(3,7)

print(t[0],t[1])
# 3 7

print(t.bottom, t.height)
# 3 7

위와 같이 네임드튜플에 쓴 이름으로 접근이 가능하고 또 인덱싱으로도 접근이 가능하다

하지만 수정에 있어서는 되지 않는다

왜냐하면 튜플로 감싸준거기 때문에 안에 있는 것이 리스트로 묶어놓았다고 할지라도 수정은 안된다.

 

 


 

Extra

네임드 튜플 언패킹

네임드 튜플을 대상으로도 언패킹을 진행할 수 있다.

t=Tri(12,79)
a,b=t
print(a,b)
# 12 79

 

*을 붙여 언패킹을 할 수 있다 이것은 튜플, 리스트 둘다 가능하다.

t=Tri(3,8)
print(*t)
# 3 8

>>> N=[1,2,3,4]
>>> print(*N)
1 2 3 4

 

그리고 함수의 매개변수로도 전달할 수도 있다.

형식1

'''
함수(매개변수)
'''

func(*iterable)
func(**dict) # **dict는 dict객체의 value값을 풀어서 전달

위와 같은 형식으로 된다. 

 

예를 살펴보자

def who(a,b,c):
	print(a, b, c, sep = ', ')
    
who(*[1,2,3])
# 1, 2, 3

who(*(0.1, 0.2, 0.3))
# 0.1, 0.2, 0.3

who(*'abc')
# a, b, c

d=dict(a=1,b=2,c=3)
who(*d)
# a, b, c

who(**d)
# 1, 2, 3

who(*(d.items()))
# ('a', 1), ('b', 2), ('c', 3)

위와 같이 dict인 사전에 *하나만 붙이면 key값이 **인 2개를 붙이면 value값들이 풀어져서 전달이 된다.

 

형식2

def func(*args):
	pass

def func(**args):
	pass

**인 2개에 해당하는 것은 dict인 사전의  key=value형태로 매개변수로 전달해야하고 출력은 dict로 나오게 된다,

 

예를 살펴보자

def func1(*args):
	print(args)

def func2(**args):
	print(args)
    
func1(1)
# (1, )

func2(a=1)
# {'a' : 1}



def func(*args1,**args2):
	print(args1)
    print(args2)
    
func(1,a=1)
'''
(1, )
{'a': 1}
'''

위의 코드와 결과에 해당하는 것을 보았을때 

 

*args에 해당하는 것은 매개변수로 들어온것들이 튜플로 묶여서 args에 전달된다.

 

**args에 해당하는 것은 매개변수로 들어온것이 사전인 dict로 묶여서 args에 전달된다. 이때 key=value형태로 매개변수를 입력해야한다.

 

 

 

참고한 책 : 윤성우의 열혈파이썬 중급편

반응형
Comments