Search

파이썬 다운 프로그래밍

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. publicnon-public 속성을 구분하라

class Student: def __init__(self, name, grades): self.name = name # public self._grades = grades # non-public (접근은 내부에서만)
Python
복사
_grades는 외부에서 직접 수정하지 않도록 보호

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
복사
인덱스를 직접 다루지 않고, zip으로 병렬 순회

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
복사
학생 정보를 이름(key) 기준으로 빠르게 접근 가능

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
복사
벡터 연산 등은 NumPy로 성능 향상

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
복사
print(student)과 repr(student)을 적절히 구분

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
복사
pathlib 및 os 모듈로 운영체제 독립적 경로 처리

요약

이 코드는 다음 원칙들을 충실히 따릅니다:
모듈화된 구조 (함수/클래스)
명확한 문서화 (docstring)
정보 은닉 (non-public 속성)
파이썬스러운 문법 (zip, list comprehension)
안정성 높은 에러 처리 (try-except)
범용성과 재사용성 높은 데이터 구조 (dict, pickle 등)