Python深化(名称調整)-1


深化Python(名称tuple)

  • の2点間の距離に基づいて式を求めて符号化した.
  • # 파이썬 심화
    # 데이터 모델(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ライブラリから取得する必要があります