파이썬 심화(네임드 튜플)-1

팔리동·2021년 4월 15일
0

파이썬 심화 (네임드 튜플)

  • 두점사이의 거리 구하는 공식을 기반으로 코딩을 했다.

# 파이썬 심화
# 데이터 모델(data model)
# Nametuple 실습 
# 파이썬의 중요한 핵심 프레임 워크 -> 시퀀스(Sequence), 반복(Iterator), 함수(Functions), 클래스(Class)

# 객체 -> 파이썬의 데이터를 추상화 
## 모든 객체 -> id, type -> value 
# 파이썬 -> 일관성 
 
# 일반적인 튜플 사용  
# x값과 y값이 뭔지 알려줘야한다. 
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt # 루트 함수 뺴옴
line_leng1 = sqrt((pt2[0] - pt1[0]) ** 2 + (pt2[1] - pt1[1]) ** 2)
print('EX1-1 - ', line_leng1) # EX1-1 -  3.8078865529319543



# 네임드 튜플 사용

from collections import namedtuple

# 네임드 튜플 선언 
Point = namedtuple('Point', 'x y')

# 두 점 선언 
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

# 계산 
line_leng2 = sqrt((pt2.x - pt1.x) ** 2 + (pt2.y - pt1.y) ** 2)

# 출력 
print('EX1-2 -', line_leng2) #EX1-2 - 3.8078865529319543
print('EX1-3 -', line_leng2 == line_leng1) # EX1-3 - True

# 네임드 튜플 선언 방법 
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
# 여기서'point'는 아무값이나 넣어도 된다. 

# 출력 
print('EX2-1 -', Point1, Point2, Point3, Point4) # EX2-1 - <class '__main__.Point'> <class '__main__.Point'> <class '__main__.Point'> <class '__main__.Point'>
# 전부 클래스 형태라고 찍힌다. 

# Dict to Unpacking
temp_dict = {'x': 75, 'y': 55}  # dict형태로 키값을 정할 수 있음 

# 객체 생성 

p1 = Point1(x=10, y=35)
p2 = Point2(20, 40)
p3 = Point3(45, y=20)
p4 = Point4(10, 20, 30, 40) # rename=True 값이 알아서 겹치지 않는 이름으로 바꿔준다. 
p5 = Point3(**temp_dict) # dict 형태를 키로 쓸려면 앞에 ** 을 붙여야함 

print('EX2-2 -', p1, p2, p3, p4, p5)
# EX2-2 - 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) 
  • 일반적인 튜플을 사용하면 위 같은 식을 표현할 때 x값과 y값을 별도로 표기하지 않으면 알아보기 어렵다.

  • 반면 네임드 튜플을 사용하면 클래스를 다루듯이 사용할 수 있다.

  • 선언 방법과 사용법은 코드를 참조하자.

네임드 튜플, 그룹리스트

  • 위 코드에서 이어지는 코드다.
# 사용 
print('EX3-1 -', p1[0]+p2[1]) # index error 주의  # 50
print('EX3-2 -', p1.x+p2.y)  # 클래스 변수 접근 방식  # 50

# Unpacking 
x,y = p3

print('EX3-3 -', x+y)  # 65 (20 + 45) 

# Rename 테스트 
print('EX3-4 -', p4)

#EX3-4 - Point(x=10, y=20, _2=30, _3=40)

# 네임드 튜플 메소드 

temp = [52,38] 

# _make() : 새로운 객체 생성 
p4 = Point1._make(temp)

print('EX4-1 -', p4)  #EX4-1 - Point(x=52, y=38) <- p4가 바뀌었다.

# _fields: 필드 네임 확인 
print('EX4-2 -', p1._fields,p2._fields,p3._fields,p4._fields,p5._fields)
# EX4-2 - ('x', 'y') ('x', 'y') ('x', 'y') ('x', 'y') ('x', 'y')

# _asdict() : Dict 반환

print('EX4-3 -', p1._asdict(),p2._asdict())
# EX4-3 - {'x': 10, 'y': 35} {'x': 20, 'y': 40}

# _replqce() : 수정 된 '새로운' 객체 반환 

print('EX4-4 -', p2._replace(y=100))
# EX4-4 - Point(x=20, y=100)
print(p2)  
# Point(x=20, y=40) -> 기존 것이 나온다. 


# 실 사용 실습 
# 학생 전체 그룹 생성 
# 반 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()
print(ranks,numbers)
# ['A', 'B', 'C', 'D'] ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']

# LIst comprehension 
students = [Classes(rank,number) for rank in ranks for number in numbers]

print('EX5-1 -',len(students))
# EX5-1 - 80
print('EX5-2 -',students)
# EX5-2 - [Classes(rank='A', number='1'), Classes(rank='A', number=‘2’),……….Classes(rank='D', number='20')]
print(students[4].rank)
# A

# 가독성이 안 좋은 경우 
students2 = [Classes(rank,number) for rank in 'A B C D'.split() for number in [str(n) for n in range(1,21)]]
print(students2)

print('EX6-1 -',len(students2))
# EX6-1 80 
print('EX6-2 -',students2)
# EX6-2 - [Classes(rank='A', number='1'), Classes(rank='A', number=‘2’),……….Classes(rank='D', number='20')]

# 출력 
for s in students:
    print('EX7-1 - ', s)

# EX7-1 -  Classes(rank='A', number='1')
# EX7-1 -  Classes(rank='A', number='2')
# EX7-1 -  Classes(rank='A', number='3')
	.
	.
	.
	.
# EX7-1 -  Classes(rank='D', number='19')
# EX7-1 -  Classes(rank='D', number='20')
  • 네임드 튜플 사용법을 잘 익히도록 하자

  • 방대한 데이터를 다룰 때 유용하게 사용할 것 같다.

  • _make(), _fields, _asdict(), _relace()등 네임드 튜플 메소드를 잘 익혀두자

  • 네임드 튜플은 꼭 from collections import namedtuple라이브러리에서 뽑아써야한다

profile
배움의 기록

0개의 댓글