파이썬 심화(네임드 튜플)-1
파이썬 심화 (네임드 튜플)
- 두점사이의 거리 구하는 공식을 기반으로 코딩을 했다.
# 파이썬 심화
# 데이터 모델(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
라이브러리에서 뽑아써야한다
Author And Source
이 문제에 관하여(파이썬 심화(네임드 튜플)-1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@sdk1926/파이썬-심화네임드-튜플-1
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# 사용
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
라이브러리에서 뽑아써야한다
Author And Source
이 문제에 관하여(파이썬 심화(네임드 튜플)-1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sdk1926/파이썬-심화네임드-튜플-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)