[1일 1모듈] collections -1: namedtuple
1일 1 모듈이지만 collection은 죄다 쪼개서 볼 것이다.
💡 선요약: |
*공부하면서 작성한 글- 틀린 게 있다면 언제든지 피드백 SVP~!*
최근 데이터의 중요성이 부각되고 있는 건 모두가 알고 있는 사실, 이러한 모듈들을 잘 사용하면 속도도 더욱 빠르고, 메모리도 절약하는 경제적인 코딩을 할 수 있다고 한다.
namedtuple: ㅎㅇ 나 튜플. 이름 내놔
namedtuple이라는 단어를 뜯어보면, 말 그대로 '이름이 붙여진 튜플'이다. 작고 간단한 클래스를 만드는 것과 유사하다.
💡 튜플의 특성! - immutable: 한번 생성되면 값을 변경할 수 없다. - iterable: 자료형 내의 데이터는 순서를 가진다. # (1, 2, 3) 이라는 튜플 내에서 순서가 유의미하다는 뜻 |
이런 튜플에 이름을 주면 어떻게 될까? 튜플 안의 데이터에 접근할 때, 순서로 접근하는 것이 아니라 이름으로 접근할 수 있게 된다. 이름으로 데이터에 접근하게 될 수 있었다는 점에서 클래스라고 표현하는 것으로 이해했다.
위치 인덱스 대신 이름으로 필드에 액세스하는 기능을 추가합니다.
정의는 요렇게
namedtuple(
typename, # tuple에 부여할 이름
field_names, # tuple안의 데이터들이 가질 이름 보통 리스트 형태로 쓰거나 'x y', 'x, y'와 같은 형태도 가능
*,
rename=False, # True시 유효하지 않은 필드명은 위치이름으로 대체
defaults=None, # field_names에서 지정된 필드들의 default 값, 오른쪽부터 적용된다.
module=None # 네임드 튜플의 __module__ 어트리뷰트가 해당 값으로 설정됩니다. 라고 하는데 이해를 잘 못했당... 쭈굴...
)
예시 ㄱㄱ
# 공식 문서에서 긁어왔당
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
p[0] + p[1] # iterable 특성 O, result = 33
p.x + p.y # 위치 indexing, result = 33
다음은 rename=True 설정시의 예시
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'x'], rename=False)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
......
ValueError: Encountered duplicate field name: 'x'
###########################################################
>>> Point = namedtuple('Point', ['x', 'x'], rename=Ture) # 정상생성
>>> a = Point(1, 2)
>>> a
Point(x=1, _1=2)
보다시피 rename=False설정시 중복된 이름이 있을 경우 에러가 발생하지만, True 설정 시 해당 데이터의 위치로 이름이 변경된다.
namedtuple 메서드
# _make()로 namedtuple에 할당
>>> t = [11, 22]
>>> tmp = Point._make(t)
>>> tmp
Point(x=11, y=22)
#_asdict(): 이름만 봐도 딕셔너리로
>>> tmp._asdict()
{'x': 11, 'y': 22}
# 참고로, 3.1~3.7 버전: OrderedDict 반환, 그 외 dict 반환(파이썬 3.7부터 dict도 iterable)
#_replace() 말그대로 대체
>>> tmp._replace(x = 1)
>>> tmp
Point(x=1, y=22)
# _fields 필드값 반환
>>> tmp._fields
('x', 'y')
# _field_defaults 필드명을 기본값으로 매핑
>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
>>> Account._field_defaults
{'balance': 0}
>>> Account('premium')
Account(type='premium', balance=0)
아래 부분도 알게 된다면 코딩이 더욱 원활해 질 것 같다!
1. 만일 문자열로 필드를 조회하고 싶다면 getattr( {object}, '{field_name}' 을 통해 조회하면 된다!
2. dict -> namedtuple 로 반환하고 싶다면 **를 사용하자
>>> d = {'x': 11, 'y': 22}
>>> Point(**d)
3. namedtuple을 사용하면 class 생성시 __init__을 번거롭게 쓰지 않아도 될 것 같다.
참고문헌
(아래 문서는 모두 한글이다. 와! 세종대왕님!)
파이썬 공식 문서: https://python.flowdas.com/library/collections.html
Youtube 채널 TeamLab: https://www.youtube.com/channel/UC_kvhNYJtP1-Ap67byTbfuw
시니어가 되는 그날까지!