일반적인 tuple과 namedtupel 사용방법
- 일반적인 tuple 사용시, 인덱스로 접근하므로 오류 가능성이 높고, 직관적이지 않다
# 네임드 튜플 사용
from collections import namedtuple
from math import sqrt
# 일반적인 튜플 사용
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
# 일반적인 튜플 계산, 인덱스로 접근가능
l_leng1 = sqrt((pt2[0] - pt1[0]) ** 2 + (pt2[1] - pt1[1]) ** 2)
# 네임드 튜플 선언
Point = namedtuple('Point', 'x y')
# 두 점 선언
pt3 = Point(1.0, 5.0)
pt4 = Point(2.5, 1.5)
# 네임드 튜플 계산, 키값으로 접근 가능, 직관적임
l_leng2 = sqrt((pt4.x - pt3.x) ** 2 + (pt4.y - pt3.y) ** 2)
# 출력
print(l_leng1)
print(l_leng2)
print(l_leng1 == l_leng2)
--------------------------------------------[result]
3.8078865529319543
3.8078865529319543
True
Namedtuple 선언 방법
Point1 = namedtuple('Point', ['x', 'y'])
Point2 = namedtuple('Point', 'x, y')
Point3 = namedtuple('Point', 'x y')
Point4 = namedtuple('Point', 'x y x class', rename=True) # Default=False, 키값중복이나 예약어 사용시
# 출력
print(Point1, Point2)
print(Point3, Point4)
--------------------------------------------[result]
<class '__main__.Point'> <class '__main__.Point'>
<class '__main__.Point'> <class '__main__.Point'>
객체 생성 및 접근방법
# Dict to Unpacking
temp_dict = {'x': 75, 'y': 55}
# 객체 생성
print('객체 생성')
p1 = Point1(x=10, y=35)
p2 = Point2(20, 40)
p3 = Point3(45, y=20)
p4 = Point4(10, 20, 30, 40)
p5 = Point3(**temp_dict) # dict type un-packing, * 1 개면 튜플 or 리스트.
# 출력
print(p1, p2, p3)
print(p4, p5)
print()
# 사용, 접근방법 차이.
print(p1[0] + p2[1]) # 인덱스 접근방식, Index Error 주의
print(p1.x + p2.y) # 클래스 변수 접근 방식
# Unpacking
print('>>> un-packing')
x, y = p3
print(x+y)
# Rename 테스트
print(p4)
print(p4._fields)
--------------------------------------------[result]
객체 생성
Point(x=10, y=35) Point(x=20, y=40) Point(x=45, y=20)
Point(x=10, y=20, _2=30, _3=40) Point(x=75, y=55)
50
50
>>> un-packing
65
Point(x=10, y=20, _2=30, _3=40)
('x', 'y', '_2', '_3')
_make() 를 이용한 개체 생성(리스트 -> 네임드 튜플)
# 네임드 튜플 메소드
temp = [52, 38]
# _make() : 새로운 객체 생성
p4 = Point1._make(temp)
print('_make(): 새로운 객체 생성')
print(p4)
print()
# _fields : 필드 네임 확인
print('._fields : 필드 네임 확인, 키값조회')
print(p1._fields, p2._fields, p3._fields, p4._fields)
print()
# _asdict() : OrderedDict 반환
print('_asdict() : OrderedDict 반환')
print(p1._asdict(), p4._asdict())
print(p1._asdict())
print(p4._asdict())
--------------------------------------------[result]
_make(): 새로운 객체 생성
Point(x=52, y=38)
._fields : 필드 네임 확인, 키값조회
('x', 'y') ('x', 'y') ('x', 'y') ('x', 'y')
_asdict() : OrderedDict 반환
OrderedDict([('x', 10), ('y', 35)]) OrderedDict([('x', 52), ('y', 38)])
OrderedDict([('x', 10), ('y', 35)])
OrderedDict([('x', 52), ('y', 38)])
실습
# 실 사용 실습
# 반20명 , 4개의 반-> (A,B,C,D) 번호
# 네임드 튜플 선언
Classes = namedtuple('Classes', ['rank', 'number'])
# 그룹 리스트 선언
numbers = [str(n) for n in range(1, 21)]
ranks = 'A B C D'.split()
# List Comprehension
students = [Classes(rank, number) for rank in ranks for number in numbers]
print('len(students): ', len(students))
# print('students: ', students)
# 추천
students2 = [Classes(rank, number)
for rank in 'A B C D'.split()
for number in [str(n)
for n in range(1,21)]]
print()
print('len(students2)', len(students2))
# print('students2: ', students2)
print(students==students2)
--------------------------------------------[result]
len(students): 80
len(students2) 80
True
'Python > Intermediate' 카테고리의 다른 글
[Python] 고급 - 리스트 및 튜플(2) (0) | 2021.05.23 |
---|---|
[Python] 고급 - 리스트 및 튜플(1) (0) | 2021.05.22 |
[Python] Magic Method(2) (0) | 2021.05.21 |
[Python] Magic Method(1) (0) | 2021.05.21 |
[Python] Class(3) - Class Method, Static Method (0) | 2021.05.21 |