Developer_Neo
[python] 네임드 튜플 본문
네임드 튜플
왜?
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형태로 매개변수를 입력해야한다.
참고한 책 : 윤성우의 열혈파이썬 중급편
'프로그래밍 > Python' 카테고리의 다른 글
[python] 연산자 오버로딩, 정보은닉과 , __dict__ (0) | 2022.01.20 |
---|---|
[python] 클래스 상속, 메소드 오버라이딩, __init__ 메소드의 오버라이딩 (0) | 2022.01.19 |
[python] 제너레이터 함수 (0) | 2022.01.18 |
[python] Iterable객체와 Iterator객체 (0) | 2022.01.18 |
[python] 컴프리헨션(Comprehension) (0) | 2022.01.18 |