1. 가능한 한 함수나 클래스 모듈을 사용하라
class Student:
"""학생 정보를 담는 클래스"""
def __init__(self, name: str, grades: list):
self.name = name
self._grades = grades # Non-public 속성
def average(self) -> float:
"""학생의 평균 점수를 계산"""
return sum(self._grades) / len(self._grades)
Python
복사
2. docstring을 작성하라
def load_students(data: list) -> dict:
"""
리스트 형태의 학생 데이터를 받아 딕셔너리 형태로 반환한다.
:param data: [("홍길동", [90, 80]), ("김철수", [70, 85])]
:return: {"홍길동": Student, "김철수": Student}
"""
return {name: Student(name, grades) for name, grades in data}
Python
복사
3. public과 non-public 속성을 구분하라
class Student:
def __init__(self, name, grades):
self.name = name # public
self._grades = grades # non-public (접근은 내부에서만)
Python
복사
4. 리스트 다룰 때 인덱스를 피하라 (iteration, zip 사용)
names = ["홍길동", "김철수"]
scores = [[90, 80], [70, 85]]
for name, score in zip(names, scores):
print(f"{name} 평균 점수: {sum(score) / len(score):.1f}")
Python
복사
5. 함수에서 입력 값은 인수로, 출력은 return 값으로 처리하라
def get_top_student(students: dict) -> str:
"""가장 평균 점수가 높은 학생의 이름 반환"""
return max(students.values(), key=lambda s: s.average()).name
Python
복사
6. if-elif-else 대신 예외처리를 사용하라
def get_student(students: dict, name: str) -> Student:
try:
return students[name]
except KeyError:
raise ValueError(f"{name} 학생이 존재하지 않습니다.")
Python
복사
7. 순서 없는 시퀀스는 딕셔너리를 사용하라
students = {
"홍길동": Student("홍길동", [90, 80]),
"김철수": Student("김철수", [70, 85])
}
Python
복사
8. Structured 데이터 대신 중첩된 이종 리스트/사전 사용
raw_data = [
{"name": "홍길동", "grades": [90, 80]},
{"name": "김철수", "grades": [70, 85]}
]
Python
복사
9. 배열과 같은 대규모 수치 데이터는 NumPy 사용
import numpy as np
def calc_stats(grades):
arr = np.array(grades)
return arr.mean(), arr.std()
mean, std = calc_stats([90, 80, 70])
print("평균:", mean, "표준편차:", std)
Python
복사
10. 리스트 내포를 사용하라
student_names = [student.name for student in students.values()]
Python
복사
11. __str__과 __repr__ 정의
class Student:
def __str__(self):
return f"{self.name} 평균: {self.average():.1f}"
def __repr__(self):
return f"Student(name={self.name!r}, grades={self._grades!r})
Python
복사
12. 데이터 구조의 저장 방법 사용 (repr, Pickle, Shelve 등)
import pickle
# 저장
with open("students.pkl", "wb") as f:
pickle.dump(students, f)
# 로드
with open("students.pkl", "rb") as f:
loaded_students = pickle.load(f)
print(repr(loaded_students["홍길동"]))
Python
복사
13. 운영체제에 의존하지 않는 시스템 인터페이스 사용
import os
from pathlib import Path
base_path = Path(os.getcwd())
data_file = base_path / "students.pkl"
print("파일 경로:", data_file)
Python
복사
요약
이 코드는 다음 원칙들을 충실히 따릅니다:
•
모듈화된 구조 (함수/클래스)
•
명확한 문서화 (docstring)
•
정보 은닉 (non-public 속성)
•
파이썬스러운 문법 (zip, list comprehension)
•
안정성 높은 에러 처리 (try-except)
•
범용성과 재사용성 높은 데이터 구조 (dict, pickle 등)