데이터 공부기록

[Python] Class 1 본문

카테고리 없음

[Python] Class 1

standingR 2024. 3. 28. 13:16

1. 기본 설명

기본적인 목적 : 코드들을 기능 중심으로 구조화!!!!!
   ==> 함수 : 입력 / 출력 / 기능
   ==> 클래스 : 내가 필요한 대상(속성, 기능)
   ==> 패키지 : 필요한 여러가지 들을 모아둔!!!!!
       pandas, scikit-learn + optuna, TF/PyTorch ,,,,,
        DF          DF/Array             Tensor(Array)
 ===> 내가 불편해서 필요한거 만들겠다!! 자주 사용되는 것들

 체계적으로 기능 중신들로 어떻게 구성을 할까
참고 ) 데이터 수집, 데이터 분석, 머신러닝 : 함수정도면 충분함!!
딥러닝 : TensorFlow ---> Keras : 함수
        프로젝트(최신것) PyTorch : 클래스

 

2. 예시 

 

Q .학생들에 대한 국어, 영어, 수학, 과학 점수들을 처리하고자 함
1) 주어진 정보들을 파이썬의 특징을 활용해서 꾸역꾸역
=> 우리반 전체 학생들에 대해서 : 리스트
    개별 학생에 대한 정보 : dictionary

 

students = [
    {"name":"AAA", "korean":98,"math":93, "english":79, "science":95},
    {"name":"BBB", "korean":78,"math":87, "english":87, "science":90},
    {"name":"CCC", "korean":90,"math":85, "english":89, "science":92},
    {"name":"DDD", "korean":80,"math":96, "english":99, "science":93},
    {"name":"EEE", "korean":70,"math":80, "english":89, "science":95},

]

 

우리반 학생별로 4과목 성적에 대한 총점 / 평균 점수를 출력하자
출력 : 학생이름 , 4과목 총점, 4과목에 평균 출력

 

 

print("이름","총점","평균", sep="\t") # sep : 출력대상 사이 . end : 다 출력하고 뭐 (줄바꿈)
for student in students:
    # 개별 학생에 대해서 할 일에!!
    score_sum = student["korean"] + student["math"] \
    +student["english"] + student["science"]
    score_avg = score_sum /4
    print(student["name"], score_sum, score_avg, sep="\t")

- sep ="\t" : \t를 기분으로 구분

 

 

-2) 학생정보 생성 함수 

# 2) 학생들에 대한 정보를 생성하는 함수!!!!!!
#    ===> 학생마다 정보를 만들 때 키값이 반복이 되고 있다..
#         귀찮으니,,,,함수로 만들어서 처리해보자!!!!
#    ===> 가장 반복없는 기본이 되는 정보들만 가지고 생
def create_student( name, kor, math, english, science):
    return{"name" : name , "korean":kor,
           "math": math, "english":english,
           "science":science}

 

- 단순화

def create_studnet( n, k, m, e, s):
    return { "name":n, "korean":k,
            "math":m, "english":e,
             "science": s}
# ---> 함수로 개별 학생에 대한 정보를 생성하자!!!!
students=[
    create_studnet("AAA", 98,93,79,95),
    create_studnet("BBB", 78,87,87,90),
    create_studnet("CCC", 90,85,89,92),
    create_studnet("DDD", 80,96,99,93),
    create_studnet("EEE", 70,80,89,95)
]
#students
print("이름","총점","평균", sep="\t")
for student in students:
    print(student_to_string(student))

 

 

- 3 필요한 기능들을 최대한 함수화

#3) 필요한 기능들에 대해서 다 함수화를 최대한 해보자!!
# 1명 학생에 대한 정보를 생성하는 함수
# 1명 학생에 대한 정보를 바탕으로 총점을 구하는 함수
# 1명 학생에 대한 정보를 바탕으로 평균을 구하는 함수
# 1명 학생에 대한 정보를 출력하는 함수(이름, 총점, 평균)

 

# 1명 학생에 대한 정보를 생성하는 함수
# 입력 : 이름, 국어. 수학, 영어. 과학
# 기능 : 학생 정보를 Dict 생성
# 출력 : 1명 학생 정보 Dict

def create_studnet( n, k, m, e, s):
    return { "name":n, "korean":k,
            "math":m, "english":e,
             "science": s}

# -1명 학생에 대한 총점으로 계산해주는 함수
# 입력 : 1명 학생의 정보
# 충점을 꼐산
# 출력 : 충점
def student_get_sum( studnet ): # student = {"name" : "AAA"}
    score_sum = studnet["korean"]  + studnet["korean"]\ 
    + studnet["english"]+ studnet["science"]
    
    return score_sum
# - 1명 학생에 대한 4과목 평균을 함수
# - 입력 : 학생 1명에 대한 정보
#   기능 : 4과목 점수 평균 계산
#   출력 : 평균 점수
def studnet_get_avg( studnet ):
    score_avg = student_get_sum(studnet) / 4
    return score_avg

# - 1명 학생에 대한 정보 출력하는 함수/기능!!!!
# - 입력 : 학생 1명에 대한 정보
#   기능 : 정보를 출력 문자열생성 ->이름, 총점, 평균
#   출력 : 출력할 문자열

def student_to_string(studnet):
    temp = "{0}\t{1}\t{2}".format( studnet["name"],
                               student_get_sum(studnet),
                                studnet_get_avg(studnet))
    return temp

 

# 함수로 개별 학생에 대한 정보 생성

# ---> 함수로 개별 학생에 대한 정보를 생성하자!!!!
students=[
    create_studnet("AAA", 98,93,79,95),
    create_studnet("BBB", 78,87,87,90),
    create_studnet("CCC", 90,85,89,92),
    create_studnet("DDD", 80,96,99,93),
    create_studnet("EEE", 70,80,89,95)
]
#students
print("이름","총점","평균", sep="\t")
for student in students:
    print(student_to_string(student))

 

참고) 파이썬의 문자열을 표현하는 방식 크게 3가지
% 연산자를 활용해서 표현
format() 함수로 표현
f-string 통해서 표현
===> 나는 f-string으로 사용

 

a = 345
b = 86
print(f"나의 총점 : {a}, 평균:{b}")

# 나의 총점 : 345, 평균:86

 

 

 

M1  : Class 생성

 

##### 일반적으로 프로그램의 코드를 작성하는 스타일과!!!!
#     ===> 객체지향으로 설계 : Class --> Object
# : 필요한 기능 중심으로, 조립을 하는 방식( 유기적인 관계 ..)
# --> 많은 시행착오, 경험, 노하우!!!!
# ( ==> 프로그램설계 컨설턴트 : 컨설팅! ==> 단가 겁나 비싸요)
#       + DB
# ==> 동일한 기능이여도 어떻게 설계, 구조를 하느냐!!!!!!


# 클래스Class : 속성+ 기능(뭔가 틀을 생성하는게 Class)
#               점수,이름 :속성 --> Property
#               평균구해주세, 총점계산 : 기능  --> Method

# 객체 : 클래스를 기반으로 생성된 구체적인 대상!!!!
# self : 자기 자신을!!!!!!

 

class Student: # 일반적은 함수와 구별하기 위해서 대문자로 시작
    # 생성자 : 필요한 초기 속성들에 대한 초기화 !!!
    # ====> 파이썬에서 클래스 생성을 위한 미리 만든 특별함수
    # __(양옆으로 두게)__
    # (자기자신, 속성값들)
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math =   math      
        self.english = english
        self.science = science     
students=[
    create_studnet("AAA", 98,93,79,95),
    create_studnet("BBB", 78,87,87,90),
    create_studnet("CCC", 90,85,89,92),
    create_studnet("DDD", 80,96,99,93),
    create_studnet("EEE", 70,80,89,95)
]
student

 

- 적용 에시 

students[0].name

# 'AAA'

students[0].korean

#98

students[3].name

#'DDD'

 

2) 클래스 내부의 필요한 기능 추가/ 설계

 

# 클래스 내부에 ... 기능적으로 필요한 것들을 추가/ 설계 !!1
====> 너 무슨 과목은 몇점이니?
====> 너의 총점은 얼마니?

class 클래스명: # 대문자로 표기
    def __init__(self,,,,,,,):
        self.설정한 속성값 = ~~~₩
    def 메서드/기능함수(self,,,,,)
    ~~~~~~~~~~~

 

class Student: # 일반적인 함수와 구별하기 위해서 대문자로 시작
    # 생성자 : 필용한 초기 속성들에 대한 초기화!!!!!
    #         ==> 파이썬에서 클래스 생성을 위한 미리 만든 특별함수
    #             _(양옆으로 2개)
    def __init__(self, name, korean,math,english,science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
    
    # --> 필요한 기능 추가 : 총점계산, 평균계산, 출력 (이름, 총점 등등등)
    def get_sum(self):
        score_sum = self.korean + self.math + self.science + self.english
        return score_sum
    
    def get_avg(self):
        score_avg = self.get_sum() / 4
        return score_avg
    
    def to_string(self):
        temp = "{}\t{}\{}".format(self.name, self.get_sum(),self.get_avg()) 
        return temp
students=[
    Studnet("AAA", 98,93,79,95),
    Studnet("BBB", 78,87,87,90),
    Studnet("CCC", 90,85,89,92),
    Studnet("DDD", 80,96,99,93),
    Studnet("EEE", 70,80,89,95)
]
students

""
[<__main__.Studnet at 0x1078b0220>,
 <__main__.Studnet at 0x1078b0640>,
 <__main__.Studnet at 0x1078b0310>,
 <__main__.Studnet at 0x107304eb0>,
 <__main__.Studnet at 0x107304fd0>]
"""
students[0].name

# students[0].name

 

 

3) SP Method 

# ----> 특별 Method 
# 기본적인 연사자들을 내가 설계한 클래스들 사이에서
# 동작을 정의를 할 수 있음!!! + , >

# => 이런 식으로 students[0] > student[1]
# 기준은 나는 총점으로 하겠다... 국어 성적 ... 설계에 따라서

Special Method : === (eq), !=(ne), > : (gt), >= : (ge)
                 < : (lt), <= : (le)

 

class Student: # 일반적인 함수와 구별하기 위해서 대문자로 시작
    # 생성자 : 필용한 초기 속성들에 대한 초기화!!!!!
    #         ==> 파이썬에서 클래스 생성을 위한 미리 만든 특별함수
    #             _(양옆으로 2개)
    def __init__(self, name, korean,math,english,science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
    
    # --> 필요한 기능 추가 : 총점계산, 평균계산, 출력 (이름, 총점 등등등)
    def get_sum(self):
        score_sum = self.korean + self.math + self.science + self.english
        return score_sum
    
    def get_avg(self):
        score_avg = self.get_sum() / 4
        return score_avg
    
    def to_string(self):
        temp = "{}\t{}\{}".format(self.name, self.get_sum(),self.get_avg()) 
        return temp
##################### -> 2의 학생 클래스 끼리의 연산자들을 사용해서 비교
# 저의 기준 : 4과목 총점을 기준으로 비교 !!!!!!!!!!!!!!(개인별로 목적에 맞춰서....!)
    # sp mathod =
    def __eq__(self, value): # std1 == std2, 총점
        return self.get_sum() == value.get_sum()
        #return self.korean == value.get_sum()    
    def __ne__(self, value):
        return self.get_sum() != value.get_sum()
     
    def __gt__(self, value):
         return self.get_sum() > value.get_sum()
     
    def __ge__(self, value):
         return self.get_sum() >= value.get_sum()
    
    def __lt__(self, value):
         return self.get_sum() < value.get_sum()
    
    def __le__(self, value):
         return self.get_sum() <= value.get_sum() 

 

students=[
    Studnet("AAA", 98,93,79,95),
    Studnet("BBB", 78,87,87,90),
    Studnet("CCC", 90,85,89,92),
    Studnet("DDD", 80,96,99,93),
    Studnet("EEE", 70,80,89,95)
]
students

 

students[0].get_sum()

# 365
# ==> 클래스에 각 생성된 객체끼리 비교 연산자기능을 정의를 했고, 그 떄 정의가 총점을 기준으로!

# C번 학생하고 1번 학생하고 총점이 같니?
students[0] == students[1]

# False

 

- 지정된 연산자로 설정하는것 

## 클래스 
# ===> 필요한 속성값 : property ( 변수 값)
# ===> 필요한 기능 / 함수 : method ( 필요한 기능/ 함수) 클래스 내에서 필요한 기능들
+ 비교, + 이미 지정된 연산자들에서도 동작할 수 있도록 설계!!!

====> 내가 필요한 것들을 잘 설계해서 편하게 쓰자!!!
class Square:
    def __init__(self, size):
        self.size = size
    
    def get_area(self):
        return self.size * self.size
class Square:
    def __init__(self, size):
        self.__size = size
    
    def get_area(self):
        return self.__size * self.__size
    ## 내부 속성에 대한 접근을 기능적으로 따로 설계!!!!
    # 1. 속성값을 나한테 알려주세요 !!! : ~~~ get
    def get_size(self):
        return self.__size
    # 2. 속성값에 대한 변경~ !!!      : ~~~~ set ~~~~
    def set_size(self, value):
        self.__size = value
s1 = Square(10)
s1.get_area()

# 100
s1.get_size()

# 10

 

- 설정값 20으로 변경

s1.set_size(20)
s1.get_area()

# 400