본 포스팅은 Naver Boostcourse 인공지능(AI) 기초 다지기를 수강하고 제가 공부한 내용을 토대로 작성한 글입니다.
Q1. 중간고사 기말고사 점수를 따로 받아 저장하는 클래스를 구현해보세요. 단, 생성자의 인스턴스는 private으로 선언되어야하며, 데코레이터를 이용해 데이터를 저장하고, 함수를 이용해 평균값을 출력해보세요.
- 자료형의 선언과 데코레이터를 이용해보세요.
class Score: # 클래스 선언
def __init__(self, mid:int, final:int): # 객체 생성시 인스턴스 초기화 (초기생성자)
self.__mid = mid #__변수명 --> private선언할 때 사용
self.__final = final # 생성자의 인스턴스
@property # private된 변수를 반환할 때 사용
def mid(self): # 데코레이터를 이용하여 메소드(함수) 생성 (중간고사 점수 저장)
return self.__mid
@property
def final(self): # 데코레이터를 이용하여 메소드(함수) 생성 (기말고사 점수 저장)
return self.__final
if __name__ == "__main__":
a = Score(50, 75) # Score 클래스에 속하는 인스턴스로 score 객체 생성
print((a.mid + a.final)/2)
62.5
@property : 숨겨진 변수를 접근하게 해주는 데코레이터입니다. property 데코레이터를 사용했을 때 가장 큰 이점은 외부에 티를 내지 않고 내부적으로 클래스의 필드 접근 방법을 바꿀 수 있습니다. __mid로 private하게 만들어서, __mid변수에 접근하지 못했다면, @property 데코레이션을 적용하면, mid라는 필드명으로 접근하고 변경할 수 있습니다! 다시말하면, 함수를 변수처럼 호출이 가능합니다.
** (번외)데코레이터를 사용해서 private선언한 인스턴스에 접근 할 수 있게 만드는 경우 deepcopy를 사용하여 가능하면 원본 데이터에 접근을 할 수 없도록 할 수 있다.
Q2. 다양한 탈 것을 사용하는 게임을 만드는 중입니다. 빠른 구현을 위해서 이미 구현한 Car 클래스를 이용해서 Bike라는 클래스를 새로 제작하려고 합니다. Car 클래스를 상속받아서 새로운 Bike 클래스를 아래와 같이 출력되도록 구성해보세요.
- Bike class는 size인자를 추가로 가집니다.
class Car(): # Car 클래스
def __init__(self, fuel, wheels):
"""
객체 생성시 변수 초기화 함수
fuel : str, 연료종류
wheels : int, 바퀴 수
"""
self.fuel = fuel
self.wheels = wheels
class Bike(Car):
"""
Bike 클래스 (Car 클래스 상속)
size (str, 크기) 추가
"""
def __init__(self, fuel : str, wheels : int, size : str): # size 변수 추가해서 사용가능
"""
객체 생성시 변수 초기화 함수
- Car Class 상속
fuel : str, 연료 종류
wheels : int, 바퀴 수
- 추가 변수
size : str, 크기
"""
super().__init__(fuel, wheels) # 부모객체인 Car 클래스에서 상속해 올 속성들을 불러온다.
self.size = size # 속성 값 추가 (자식 클래스에 추가된 속성)
bike = Bike("gas", 2, "small") # Bike클래스에 속하는 인스턴스 bike를 생성
print(bike.fuel, bike.wheels, bike.size)
gas 2 small
class Bike에 Car를 상속하기 위해서 class Bike에 class Bike(Car)이라고 상속을 시킨다. 그런다음 super().__init__을 통해 부모 클래스인 Car안에 있는 속성들을 불러올 수 있습니다. Car 클래스의 fuel과 wheel은 사용할 꺼니까 super().__init__(self, fuel, wheels)와 같이 정의할 수 있습니다. 그런다음에 Bike클래스에 size인자를 추가하기 위해서 초기함수에 변수 size를 def __init__(self, fuel, wheel, size)와같이 추가합니다. bike라는 변수에 클래스를 할당하고 각각 값을 집어 넣으면, gas 2 small이 반환됩니다.
Q3. 이번 시험 결과에 대한 데이터를 학과 사무실에서 CSV파일로 전달해줬습니다. 우리는 이 파일을 이용해서 데이터 처리를 진행해야 합니다. 파일 입출력을 이용해 파일 데이터를 리스트로 만들어보세요.
- 파일 입출력에 사용하는 open함수를 이용해 csv파일 내부의 데이터를 읽어보세요.
import csv
class Readcsv(object): # class(예약어) / Readcsv(class이름) / objet(상속받는개체명)
# object를 안써도 python3에서는 자동상속이 일어남.
def __init__(self, file_path): # 객체 초기화 예약 함수, 속성정보 추가
self.file_path = file_path # 초기정보선언
def read_file(self): # method추가는 기존함수와 같으나 반드시 self를 추가해야지만, class함수로 인정
with open(self.file_path) as f:
data = list(csv.reader(f))
return data
file_path = './data-01-test-score.csv'
read_csv = Readcsv(file_path) #read_csv : 객체, Readcsv : 클래스
print(read_csv.read_file())
[['73', '80', '75', '152'], ['93', '88', '93', '185'], ['89', '91', '90', '180'], ['96', '98', '100', '196'], ['73', '66', '70', '142'], ['53', '46', '55', '101'], ['69', '74', '77', '149'], ['47', '56', '60', '115'], ['87', '79', '90', '175'], ['79', '70', '88', '164'], ['69', '70', '73', '141'], ['70', '65', '74', '141'], ['93', '95', '91', '184'], ['79', '80', '73', '152'], ['70', '73', '78', '148'], ['93', '89', '96', '192'], ['78', '75', '68', '147'], ['81', '90', '93', '183'], ['88', '92', '86', '177'], ['78', '83', '77', '159'], ['82', '86', '90', '177'], ['86', '82', '89', '175'], ['78', '83', '85', '175'], ['76', '83', '71', '149'], ['96', '93', '95', '192']]
with open을 쓰면, close를 안써도 됩니다. 그냥 open으로 파일을 열었으면, close로 닫아줘야합니다.
Q4. 우리는 방금 CSV 파일을 읽는 함수를 구현해보았습니다. 하지만 이를 조금 더 효율적으로 사용하기 위해서 클래스로 구성을 진행하려고 합니다. 방금 구현한 함수를 포함한 클래스를 구현해보세요.
- merge list를 이용해 리스트 내 데이터의 합을 출력해보세요.
- 데이터를 합치기 전 데이터의 자료형을 변경해보세요.
import csv
import pprint
class ReadCsv(object):
def __init__(self, file_path):
self.file_path = file_path
def read_file(self):
with open(self.file_path, 'r') as f:
data = list(csv.reader(f))
for idx in range(len(data)):
data[idx] = [int(i) for i in data[idx]]
self.data = data
return self.data
def merge_list(self):
return [sum(i) for i in self.data]
read_csv = ReadCsv(file_path)
pprint.pprint(read_csv.read_file())
print(read_csv.merge_list())
[[73, 80, 75, 152],
[93, 88, 93, 185],
[89, 91, 90, 180],
[96, 98, 100, 196],
[73, 66, 70, 142],
[53, 46, 55, 101],
[69, 74, 77, 149],
[47, 56, 60, 115],
[87, 79, 90, 175],
[79, 70, 88, 164],
[69, 70, 73, 141],
[70, 65, 74, 141],
[93, 95, 91, 184],
[79, 80, 73, 152],
[70, 73, 78, 148],
[93, 89, 96, 192],
[78, 75, 68, 147],
[81, 90, 93, 183],
[88, 92, 86, 177],
[78, 83, 77, 159],
[82, 86, 90, 177],
[86, 82, 89, 175],
[78, 83, 85, 175],
[76, 83, 71, 149],
[96, 93, 95, 192]]
[380, 459, 450, 490, 351, 255, 369, 278, 431, 401, 353, 350, 463, 384, 369, 470, 368, 447, 443, 397, 435, 432, 421, 379, 476]
read_file에서 정의한 변수를 merge_list에서 불러와 사용할 때, read_file를 불러오지 않고, merge_list만 불러올 경우, 에러가 나는 이슈를 발견했습니다. 해당 이슈를 해결하기 위해서는 read_file을 먼저 불러오고, merge_list도 불러와서 결과물을 출력할 수 있었습니다~
Q5. 이전에 구현한 클래스에서 merge_list의 함수 동작을 변경해야합니다. 단순합계가 아닌 평균을 구하는 함수로 변경해보세요
- 리스트의 데이터를 다루는 함수를 이용해서 구현해보세요.
- 최종 평균을 구한 후 오름차순으로 정렬해주세요.
import csv
import pprint
class ReadCSV(object):
def __init__(self, file_path):
# class variable
self.file_path = file_path
def read_file(self):
with open(self.file_path,'r') as f:
data = list(csv.reader(f))
for idx in range(len(data)):
data[idx] = [int(j) for j in data[idx]]
self.data = data
return data
def merge_list(self):
return sorted([sum(i)/len(i) for i in self.data])
read_csv = ReadCSV(file_path)
pprint.pprint(read_csv.read_file())
print(read_csv.merge_list())
[[73, 80, 75, 152],
[93, 88, 93, 185],
[89, 91, 90, 180],
[96, 98, 100, 196],
[73, 66, 70, 142],
[53, 46, 55, 101],
[69, 74, 77, 149],
[47, 56, 60, 115],
[87, 79, 90, 175],
[79, 70, 88, 164],
[69, 70, 73, 141],
[70, 65, 74, 141],
[93, 95, 91, 184],
[79, 80, 73, 152],
[70, 73, 78, 148],
[93, 89, 96, 192],
[78, 75, 68, 147],
[81, 90, 93, 183],
[88, 92, 86, 177],
[78, 83, 77, 159],
[82, 86, 90, 177],
[86, 82, 89, 175],
[78, 83, 85, 175],
[76, 83, 71, 149],
[96, 93, 95, 192]]
[63.75, 69.5, 87.5, 87.75, 88.25, 92.0, 92.25, 92.25, 94.75, 95.0, 96.0, 99.25, 100.25, 105.25, 107.75, 108.0, 108.75, 110.75, 111.75, 112.5, 114.75, 115.75, 117.5, 119.0, 122.5]
'Language > Python' 카테고리의 다른 글
내가 까먹을까봐 정리하는 requirements.txt로 한 방에 관리하기 (0) | 2023.12.04 |
---|---|
[python] Numpy 넘파이 버전 확인하기 (0) | 2023.10.25 |