00 개요
- 목적: 코드분석 중 from collections import namedtuple 하는데 namedtuple의 개념을 이해 및 정리하고자 함
- namedtuple을 이해하기 위해선 파이썬의 데이터 자료형인 tuple과 dictionary를 먼저 알아야 함
01 tuple이란
1. 정의
- 순서가 있는 데이터 집합 → 인덱스로 접근 가능
- 한 번 생성된 후 수정 불가
- 형태: ('a', 'b', 'c', 1, 2, 3, ...)
2. 튜플 생성
1) 괄호 사용 ( )
- Note: 괄호 안에 콤마 (,) 미사용 시 int로 선언됨
>>> tuple1 = ('abc', 123, 3.14, ['ed', 456], ('g', 'h'))
>>> tuple1
('abc', 123, 3.14, ['ed', 456], ('g', 'h'))
>>> type(tuple1)
<class 'tuple'>
# , 미사용 시 tuple 생성 안 됨
>>> integer = (5)
>>> integer
5
>>> type(integer)
<class 'int'>
2) 콤마 사용 ,
>>> tuple2 = 'abc', 123, 3.14, ['ef', 456], ('g', 'h')
>>> tuple2
('abc', 123, 3.14, ['ef', 456], ('g', 'h'))
>>> type(tuple2)
<class 'tuple'>
>>> tuple3 = 3,
>>> tuple3
(3,)
>>> type(tuple3)
<class 'tuple'>
3) tuple() 함수 사용
>>> list1 = [1, 2, 'abe', (2, 3, 4)]
>>> type(list1)
<class 'list'>
>>> tuple1 = tuple(list1)
>>> tuple1
(1, 2, 'abe', (2, 3, 4))
>>> type(tuple1)
<class 'tuple'>
02 dictionary란
1. 정의
- 순서가 없는 데이터 집합 → 인덱스로 접근 불가능
- 수정 가능
- 키(key, 중복 불가)와 값(value)의 쌍으로 이루어진 자료구조 → 고유한 key로 value에 접근 가능
- 형태: {'age': 30, 'fruits': ['apple', 'banana'], 'veg': ['cucumber', 'eggplant'], 'id': [1, 2, 3], ...}
2. dictionary 생성
1) 괄호 사용 { }
>>> dict1 = {'name': 'Pearl', 'age': 30, 1: 'one'}
>>> dict1
{'name': 'Pearl', 'age': 30, 1: 'one'}
>>> type(dict1)
<class 'dict'>
>>> dict2 = {} # 빈 딕셔너리 생성
>>> dict2
{}
>>> dict2['name'] = 'Pearl' # 'name'이라는 key에 'Pearl'이라는 value 매핑해주기
>>> dict2
{'name': 'Pearl'}
>>> type(dict2)
<class 'dict'>
2) dict() 함수 사용
- Note: key로 int 또는 str 줄 경우 에러남
>>> dict3 = dict(name='Pearl', age=30,) # key에 '' 안붙임
>>> dict3
{'name': 'Pearl', 'age': 30}
>>> type(dict3)
<class 'dict'>
# key값으로 int를 줬을 경우 에러
>>> dict3 = dict(name='Pearl', age=30, 1='one')
File "<stdin>", line 1
dict3 = dict(name='Pearl', age=30, 1='one')
^^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
# key값에 '' 붙였을 경우 에러
>>> dict3 = dict(name='Pearl', age=30, '1'='one')
File "<stdin>", line 1
dict3 = dict(name='Pearl', age=30, '1'='one')
^^^^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
3) zip() 및 dict() 함수 사용
>>> keys = ['name', 'age', 1]
>>> values = ['Pearl', 30, 'one']
>>> zipped = zip(keys, values)
>>> zipped
<zip object at 0x000001C060EEF3C0>
>>> type(zipped)
<class 'zip'>
>>> dict5 = dict(zipped)
>>> dict5
{'name': 'Pearl', 'age': 30, 1: 'one'}
>>> type(dict5)
<class 'dict'>
03 namedtuple이란
1. 정의
- 튜플(tuple)과 딕셔너리(dictionary)의 기능을 합쳐 놓은 자료형
- '이름이 지어진 튜플'로서, 딕셔너리와 같이 인덱스가 아닌 '이름'으로 데이터 조회가 가능하며 생성된 필드 (딕셔너리의 key와 비슷)에 할당되는 데이터를 지닌 클래스 객체 생성 가능
- 즉, namedtuple은 딕셔너리와 마찬가지로 key-value 쌍으로 데이터를 저장하지만, 키 대신 필드 이름을 사용
- 또한, 튜플처럼 한 번 생성된 후에는 수정이 불가능
- 그러므로 namedtuple은 데이터 집합의 구조가 변하지 않는 경우에 유용하게 사용
- 형태:
- 변수 = namedtuple( '클래스명' , ['필드명1', '필드명2', '필드명3', ...] )
- 변수 = namedtuple( '클래스명' , ('필드명1', '필드명2', '필드명3', ...) )
2. namedtuple 생성
- namedtuple 함수는 첫 번째 인자로 클래스 이름을, 두 번째 인자로는 필드 이름의 리스트나 튜플을 전달
>>> from collections import namedtuple
# 'Person'이라는 이름을 가진 namedtuple 클래스를 생성하여 Person_Class에 저장
>>> Person_Class = namedtuple('Person', ['name', 'age', 'gender'])
>>> Person_Class
<class '__main__.Person'>
# Person 클래스의 객체 (namedtuple) 생성
>>> person1 = Person_Class('Amy', 15, 'Female')
>>> person2 = Person_Class('Mike', 21, 'Male')
# namedtuple 값 확인
>>> person1
Person(name='Amy', age=15, gender='Female')
>>> person2
Person(name='Mike', age=21, gender='Male')
# namedtuple 객체 타입 확인
>>> print(type(person1), type(person2))
<class '__main__.Person'> <class '__main__.Person'>
# namedtuple 객체의 필드 이름으로 접근
>>> print(person1.name, person2.name, person1.age, person2.age, person1.gender, person2.gender)
Amy Mike 15 21 Female Male
# namedtuple 객체의 인덱스로 접근
>>> print(person1[0], person1[1], person1[2])
Amy 15 Female
>>> print(person1[3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
- 설명:
- 'Person'이라는 클래스 이름과 'name', 'age', 'gender'라는 필드 이름을 가진 namedtuple을 생성하여 Person_Class에 저장
- person1과 person2는 이제 Person 클래스의 객체
- 객체를 생성할 때 필드 이름에 해당하는 값을 인자로 전달해야 함
- namedtuple 객체의 필드는 필드 이름 및 인덱스로 접근 가능
3. namedtuple 사용 주의사항
- 필드 이름으로 유효하지 않은 식별자를 사용하지 않도록 주의
- 필드 이름은 식별자(변수, 함수 이름 등)로 사용됨 → 유효한 식별자만 사용해야 함
- 필드 이름은 유일해야 함
- namedtuple 객체의 필드 이름은 딕셔너리의 키와 같이 유일해야 함
- 중복된 필드 이름이 있다면 AttributeError 발생
- 필드 이름에 띄어쓰기나 특수문자 등을 사용하지 않도록 주의해야 함
- 필드 이름은 소문자와 언더스코어(_)로 구성된 문자열을 사용하는 것이 좋음
- namedtuple은 한 번 생성된 후에는 수정 불가능
- 따라서 객체를 생성 시 반드시 모든 필드에 값 지정 필수
- namedtuple 객체는 튜플처럼 인덱싱을 지원
- 따라서 namedtuple 객체의 필드 순서를 바꾸면 예기치 않은 결과가 발생 가능
- 필드 순서를 변경하려면 새로운 namedtuple 객체를 생성해야 함
- namedtuple 객체는 일반적인 튜플보다 약간 더 많은 메모리를 사용
- 필요에 따라 namedtuple 대신 일반 튜플을 사용하는 것이 더 효율적일 수 있음
참조
- (tuple이란) https://rfriend.tistory.com/331
- (dictionary란) https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-11-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC
- (namedtuple이란) https://python101.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-namedtuple-%EC%9D%B4%EB%9E%80#google_vignette
'Python > 기본문법' 카테고리의 다른 글
위치 인수, 키워드 인수 (파이썬 함수의 인수 종류) (0) | 2024.08.04 |
---|---|
pass continue break 차이 (파이썬 문법) (0) | 2024.08.01 |
dictionary란 (파이썬 자료구조) (0) | 2024.07.25 |
@데코레이터 Decorator (파이썬) (0) | 2024.06.28 |
_ underscore (파이썬) (0) | 2024.06.28 |