25. 05. 09 공부일지

behumble·2025년 5월 9일

공부일지

목록 보기
10/20

회고

  • 꼭 filter와 lambda만을 활용해서 search를 만들 수 있는 것은 아니다.
    리스트 컴프리헨션, 반복문을 통한 방식도 기억하자.

  • 위에서 궁금한 점이 생겼다. found는 왜 적는걸까? 답은 아래 사진에 있다.

  • 표현하는 방식이 다양하다.. 많은 코드를 보고 익혀야하는데 코드를 보고 그사람의 의도를 파악하지 못하니 "왜 이렇게 적는지"에 대해서 많은 생각이 든다. 그래도 어쩌겠나.. 계속 봐야한다. 그냥 하자.

필기

입출력 기초

#파이썬의 입출력의 기본은 파일 입출력이다.
#C언어가 처음으로 모든 장비의 입출력 기본을 파일입출력으로 한 이후 나온 언어들은
#C규칙을 따른다 
#파일은 여러개가 있어서 특정파일과 연결하는 작업이 필요하다 
#이를 open이라고 한다 
#첫번째 파라미터는 경로를 포함한 파일명이다. 
#경로 생략시 현재 프로그램이 가동중인 폴더에 파일을 만든다. 
#두번째 매개변수는 용도이다. w 는 write 용으로 파일을 만들겠다는 의미이다
#만일 파일이 없으면 새로 만든다. 기존에 파일이 존재하면 내용을 모두 지운다
file = open("데이터파일.txt", "w") #반환대상은 파일객체
file.write("Hello")#출력이 파일로 
file.close() 

#dir *.txt 확장자가 txt란 파일목록만 확인 
#type 파일명  파일내용확인하기 

#파일의 경로에  리눅스는 os / (슬래쉬)를 사용한다 
#파일의 경로에  윈도우는 os \ (역슬래쉬, 한글폰트의 경우 원화표시)를 사용한다 
#  c:\temp\test  C:탭emp탭est 
#  c:\\temp\\test    r"c:\temp\test"
#  rstring 은 문자열앞에 r을 붙이면 escape키(\)를 무력화시킨다 
# 파일경로를 나타내는 방법이 2가지가 있다. 절대적경로, 상대적경로 
# 절대적 경로는 루트부터 시작한다. c:\\test\\test
# 상대적 경로는 현재 프로그램이 가동중인 폴더 기준으로
# . :내폴더  .. :부모폴더 
#   "./test.txt"   "test.txt" 둘이 동일한 의미 
# "../test.txt" 현재 이폴더보다 하나위로 올라가서 파일을 만들어라 
# 절대경로는 특별한 경우를 제외하고는 폴더전체가 이동될때 문제가 생긴다 
# 그래서 가급적 쓰지말자. 
# 리눅스는 폴더나  파일에 공백안됨 대소문자 구분함 확장자의미없음 
# 윈도우는 폴더나 파일에 공백가능, 대소문자 구분 안함 
# 윈도우 os에서  TEST -> test  안먹힘 TEST -> 1 -> test이런식으로 바꿔야 
# 인식이 된다.  
# 드라이브명은 윈도우만 있음 

f = open("데이터파일2.txt", "w")
for i in range(1, 11):
    print(f"i={i}", file=f)
f.close()   #print 함수의 기본출력장치가 모니터인데 file이라는 파라미터에 
            #file객체를 주면 화면에 출력이 안되고 파일로 출력한다
print("작업완료")

f = open("데이터파일3.txt", "w")
for i in range(1, 11):
    s = "i= %d\n" % (i) #파이썬 2부터 있던 코드
    f.write(s) 
f.close()   #print 함수의 기본출력장치가 모니터인데 file이라는 파라미터에 
            #file객체를 주면 화면에 출력이 안되고 파일로 출력한다
print("작업완료")

f = open("/doit/데이터파일4.txt", "w")
for i in range(1, 11):
    s = "i= %d" % (i) #파이썬 2부터 있던 코드
    f.writelines(s) 
f.close()   #print 함수의 기본출력장치가 모니터인데 file이라는 파라미터에 
            #file객체를 주면 화면에 출력이 안되고 파일로 출력한다
print("작업완료")

with 구문

# f = open("mpg.csv", "r")
# line = f.readlines()
# print(line[:3])

# f = open("mpg.csv", "r")
# line = f.readlines()
# print(line[:3])
# 위처럼 파이썬 버전이 낮을경우 거듭해서 파일을 여는것은 안된다.

with open("mpg.csv", "r") as f:
    lines = f.readlines()
    print(lines[:3])

직렬화와 역직렬화

#직렬화 - 객체 자체를 파일이나 네트워크로 메모리 그대로 저장한다.
#역직렬화 - 파일이나 네트워크로부터 객체를 읽어들인다.

import pickle
data = {"name" : "홍길동", "age" : 23, 
        "phone":["010-0000-0001", "010-0000-0002"]}

#직렬화
with open("data.bin", "wb") as f:
    pickle.dump(data, f)

#역직렬화
with open("data.bin", "rb") as f:
    data2 = pickle.load(f)
    
print(data2)

성적_pickle활용

ScoreData

  • 기존 ScoreData 사용
#한사람 정보 - 데이터베이스 레코드 하나
#파이썬의 경우는 파일명과 클래스명은 아무 관계없다.
class ScoreData:
    def __init__(self, name = "홍길동", kor = 100, eng = 100, mat = 100):
        self.name = name
        self.kor = kor
        self.eng = eng
        self.mat = mat
        self.process()
         
    def process(self):
        self.total = self.kor + self.eng + self.mat
        self.avg = self.total / 3
        if self.avg >= 90:
            self.grade = "수"
        elif self.avg >= 80:
            self.grade = "우"
        elif self.avg >= 70:
            self.grade = "미"
        elif self.avg >= 60:
            self.grade = "양"
        else:
            self.grade = "가"
            
    def print(self):
        print(f"이름 : {self.name}", end = "\t")
        print(f"국어 : {self.kor}", end = "\t")
        print(f"영어 : {self.eng}", end = "\t")
        print(f"수학 : {self.mat}", end = "\t")
        print(f"총점 : {self.total}", end = "\t")
        print(f"평균 : {self.avg:.2f}", end = "\t")
        print(f"학점 : {self.grade}", end = "\n")
        
if __name__ == "__main__":
    s = ScoreData()
    s.print()

ScoreManager

  • import pickle 후 save, load 추가
from ScoreData import ScoreData
#ScoreData.py 파일에서 ScoreData 클래스를 가져와라 

import pickle

class ScoreManager:
    def __init__(self): #생성자-파이썬에서는 변수도 만들고 
                        #첫 시작시 준비작업 
        self.scoreList = [
            # ScoreData(),
            # ScoreData("조승연", 90, 80, 90),
            # ScoreData("안세영", 80, 80, 70),
            # ScoreData("김연경", 90, 90, 90),
            # ScoreData("김연아", 100, 80, 100)
        ]
    
    def printAll(self):
        for s in self.scoreList:
            s.print()

    def menuDisplay(self):
        print("--------")
        print("  메뉴   ")
        print("--------")
        print("1. 추가  ")
        print("2. 출력  ")
        print("3. 검색  ") #이름
        print("4. 수정  ") #이름
        print("5. 삭제  ") #이름
        print("6. 정렬  ") #총점 내림차순으로
        print("7. 저장  ")
        print("8. 불러오기  ")
        print("0. 종료  ")
        print("--------")
        
    def save(self): # import pickle
        with open("score.bin", "wb") as f:
            pickle.dump(self.scoreList, f)
        
    def load(self):
        with open("score.bin", "rb") as f:
            self.scoreList = pickle.load(f)
        self.printAll()
            
    def append(self): # import pickle
        sc =  ScoreData() #객체 생성 
        sc.name = input("이름 : ")
        sc.kor = int(input("국어 : "))
        sc.eng = int(input("영어 : "))
        sc.mat = int(input("수학 : "))
        sc.process()
        self.scoreList.append(sc)
        
    def search(self): #3. 검색
        name = input("찾는 이름 : ")
        #filter는 두번째 매개변수로 전달된= list를 받아서 첫번째 매개변수로 전달된 함수를 호출한다.
        #lambda 매개변수 하나(scoreList에 저장된 객체 하나), 반환은 True 또는 Flase
        resultList = list(filter(lambda x : name in x.name, self.scoreList))
        if len(resultList) == 0:
            print("찾는 이름이 없습니다.")
            return
        
        #enumerate 함수가 list를 전달하면 index와 객체 tuple을 반환
        for i, s in enumerate(resultList):
            print(f"[{i}]", end = " ")
            s.print()
    
    def modify(self): #4. 수정
        name = input("찾는 이름 : ")
        resultList = list(filter(lambda x : name in x.name, self.scoreList))
        if len(resultList) == 0:
            print("찾는 이름이 없습니다.")
            return

        for i, s in enumerate(resultList):
            print(f"[{i}]", end = " ")
            s.print()
        sel = int(input("수정할 대상은(번호) : "))
        item = resultList[sel]
        item.name = input("이름 : ")
        item.kor = int(input("국어 : "))
        item.eng = int(input("영어 : "))
        item.mat = int(input("수학 : "))
        item.process() #다시 계산하기
            
    def remove(self): #5. 삭제
        name = input("찾는 이름 : ")
        resultList = list(filter(lambda x : name in x.name, self.scoreList))
        if len(resultList) == 0:
            print("찾는 이름이 없습니다.")
            return
        for i, s in enumerate(resultList):
            print(f"[{i}]", end = " ")
            s.print()
        sel = int(input("삭제대상(번호) : "))
        self.scoreList.remove(resultList[sel])
    
    def sort(self): #6. 정렬
        #원본은 내비두고 정렬한 결과만 출력하기
        #key에 전달해야하는 람다는 매개변수하나 반환값, 정렬을 할 수 있는 데이터타입
        #>,< 연산이 가능하다.
        resultList = sorted(self.scoreList, key = lambda item : item.total, reverse = True)
        for i in resultList:
            i.print()
            
    def start(self):
        #함수주소를 배열에 저장하고 호출함
        funcList =[None, self.append, self.printAll, self.search, self.modify, self.remove, self.sort, self.save, self.load]    
        while True:
            self.menuDisplay()
            choice = int(input("선택 : "))
            if choice > 0 and choice < len(funcList):
                funcList[choice]()
            elif choice == 0:
                return print("프로그램을 종료합니다.")
            else:
                print("잘못된 메뉴입니다.")


if __name__ =="__main__":
    sm = ScoreManager()
    sm.start()

과제

주급_pickle활용(김성재풀이)

  • 사실 함수만 만들어서 풀면 되는데 클래스를 최근에 배웠다보니 접목해서 풀어봤다.
  • 전체 계산을 합치는(기본급 + 추가수당 = 총급여)를 어떻게 할지에서 막혔는데 생각해보니 간단했다. 한명 출력값 계산 할 수 있게 잡아놓고 for문 돌리면 된다. 너무 복잡하게 생각하지말자.
import pickle

class Worker:
    def __init__(self, name, worktime, perpay):
        self.name = name
        self.worktime = worktime
        self.perpay = perpay
        self.weekpay = 0
        self.pluspay = 0
        self.totalpay = 0
        
    def calweekpay(self): #기본급 계산법 
        self.weekpay = self.worktime * self.perpay
        return self.weekpay
        
    def calpluspay(self): #추가수당 계산법 
        if self.worktime > 20:
            self.pluspay = (self.perpay * 0.5) * (self.worktime - 20)
        else:
            self.pluspay = 0
        return self.pluspay
    
    def caltotalpay(self): #총급여 계산법 
        self.totalpay = self.weekpay + self.pluspay
        return self.totalpay
    
    def calAll(self):#급여계산
        self.calweekpay()
        self.calpluspay()
        self.caltotalpay()
        
    def print_info(self): #출력
        print(f"이름 : {self.name}", end = "\t")
        print(f"근무시간 : {self.worktime}", end = "\t")
        print(f"시급 : {self.perpay}", end = "\t")
        print(f"기본급 : {self.weekpay:.0f}", end = "\t")
        print(f"추가수당 : {self.pluspay:.0f}", end = "\t")
        print(f"총급여 : {self.totalpay:.0f}")
    
class WorkerManager:
    def __init__(self):
        self.workerList = [
    # Worker("김성재", 40, 15000),
    # Worker("이지은", 18, 12000),
    # Worker("박지성", 25, 20000)
]
        
    def append(self): # 1.추가
        name = input("이름 : ")
        worktime = int(input("근무시간 : "))
        perpay = int(input("시급 : "))
        worker = Worker(name, worktime, perpay)
        self.workerList.append(worker)
        print("===추가완료===")
        
    def printAll(self): # 2.출력 
        for w in self.workerList:
            w.print_info()
        
    def calAllWorker(self): # 3.계산
        for w in self.workerList:
            w.calAll()
        print("===계산완료===")
        
    def save(self): # 4.저장
        with open("workers1", "wb") as f:
            pickle.dump(self.workerList, f)
        print("===저장완료===")
        
    def load(self): # 5.불러
        with open("workers1", "rb") as f:
            self.workerList = pickle.load(f)
            self.printAll()
        print("===불러완료===")

    def main(self):
        funcList = [None, self.append,self.printAll, self.calAllWorker, self.save, self.load]
        while True:
            print("1.추가 : ")
            print("2.출력 : ")
            print("3.계산 : ")
            print("4.저장 : ")
            print("5.불러 : ")
            print("0.종료 : ")
            sel = int(input("번호를 선택하세요 : "))
            if sel > 0 and sel < 6:
                funcList[sel]()
            elif sel == 0:
                print("프로그램을 종료합니다.")
                break
            else:
                print("잘못된 번호입니다. 다시 입력하세요.")
            
            
if __name__ == "__main__":
    w1 = WorkerManager()
    w1.main()

복습

gpt를 통한 유사예제

영화관리 프로그램_객체지향

  • 어제 공부한 내용을 바탕으로 만들었다. 뿌듯하다. gpt도 안쓰고 참고내용없이 만들었다. 공부한 내용을 단순반복해서 적은거지만 객체지향적인 코드를 드디어 하나 만든것같다.
# 📘 문제: 영화 예매 시스템
# 요구사항
# Movie 클래스: 영화 제목, 장르, 가격 저장 및 출력 기능
# MovieManager 클래스: 영화 추가, 전체 출력, 검색(제목 포함), 삭제 기능 구현

class Movie:
    def __init__(self, name, genre, price):
        self.name = name
        self.genre = genre
        self.price = price
        
    def print_info(self):
        print(f"{self.name}", end = "\t"),
        print(f"{self.genre}", end = "\t"),
        print(f"{self.price}")
        
class MovieManager:
    def __init__(self):
        self.movieList = []
        
    def append(self): # 1. 영화추가
        name = input("영화 제목 : ")
        genre = input("영화 장르 : ")
        price = int(input("영화 가격 : "))
        movie = Movie(name, genre, price)
        self.movieList.append(movie)
        
    def search(self): # 2. 영화검색
        name = input("검색할 영화 제목을 입력하세요 : ")
        resultList = list(filter(lambda x : name in x.name, self.movieList))
        if len(resultList) == 0:
            print("찾는 제목이 없습니다.")
        else:
            for index, movie in enumerate(resultList):
                print(f"{index}", end = "\t")
                movie.print_info()
                
    def remove(self): # 3. 영화삭제
        name = input("삭제할 영화 제목을 입력하세요 : ")
        resultList = list(filter(lambda x : name in x.name, self.movieList))
        
        if len(resultList) == 0:
            print("찾는 제목이 없습니다.")
        else:
            for index, movie in enumerate(resultList):
                print(f"{index}", end = "\t")
                movie.print_info()
        
        sel = int(input("삭제할 인덱스를 입력하세요 : "))
        self.movieList.remove(resultList[sel])
        
        
    def printAll(self): # 4. 출력하기 
        for movie in self.movieList:
            movie.print_info()
            
    def start(self):
        while True:
            print("1. 영화추가")
            print("2. 영화검색")
            print("3. 영화삭제")
            print("4. 영화목록출력")
            print("0. 종료")
            sel = int(input("번호를 입력하세요 : "))
            if sel > 4 or sel < 0:
                print("다시 입력하세요.")
            elif sel == 1:
                self.append()
            elif sel == 2:
                self.search()
            elif sel == 3:
                self.remove()
            elif sel == 4:
                self.printAll()
            else:
                break
        print("프로그램을 종료합니다.")
        
            
if __name__ == "__main__":
    b1 = MovieManager()
    b1.start()

직원 관리 프로그램_객체지향

# 문제 설명
# 직원의 정보를 관리하는 프로그램을 작성하세요.

# 직원 1명당 다음 정보를 갖습니다:
# 사번 (emp_id)
# 이름 (name)
# 부서명 (department)

# 다음 기능을 구현하세요:
# 직원 정보 추가
# 이름으로 직원 검색
# 사번으로 직원 정보 수정 (이름, 부서명)
# 사번으로 직원 삭제
# 전체 직원 정보 출력

# class Employee -> __init__, print_info

# class EmployeeManager : -> __init__, append, search(이름으로 검색해서 직원정보나오게), 
#                            modify(사번을 통해 검색해서 이름, 부서명삭제), remove(사번을 통해 검색해서 직원정보삭제)
#                            printAll(전체 직원 출력, print_info와 연결하여 만들자))

class Employee:
    def __init__(self, emp_id, name, department):
        self.emp_id = emp_id
        self.name = name
        self.department = department
    
    def print_info(self):
        print(f"사번 : {self.emp_id}", end = "\t")
        print(f"이름 : {self.name}", end = "\t")
        print(f"부서 : {self.department}")
        
class EmployeeManager:
    def __init__(self):
        self.employeeList = []
        
    def append(self):
        emp_id = int(input("추가할 사번 : "))
        name = input("추가할 이름 : ")
        department = input("추가할 부서명 : ")
        employee = Employee(emp_id, name, department)
        self.employeeList.append(employee)
        
    def search(self):
        name = input("검색할 이름 : ")
        resultList = list(filter(lambda item : name in item.name, self.employeeList))
        if len(resultList) == 0:
            print("이름이 없습니다.")
        else:
            for index, name in enumerate(resultList):
                print(f"{index}", end = "\t")
                name.print_info()
        
    def modify(self):
        emp_id = int(input("수정할 사번 : "))
        resultList = list(filter(lambda item : item.emp_id == emp_id, self.employeeList))
        if len(resultList) == 0:
            print("사번이 없습니다.")
        else:
            for index, emp_id in enumerate(resultList):
                print(f"{index}", end = "\t")
                emp_id.print_info()
        sel = int(input("수정할 인덱스번호를 선택하세요 : "))
        item = resultList[sel]
        item.emp_id = int(input("수정할 사번 : "))
        item.name = input("수정할 이름 : ")
        item.department = input("수정할 부서 : ")
    
    def remove(self):
        emp_id = int(input("삭제할 사번 : "))
        resultList = list(filter(lambda item : item.emp_id == emp_id, self.employeeList))
        if len(resultList) == 0:
            print("사번이 없습니다.")
        else:
            for index, emp_id in enumerate(resultList):
                print(f"{index}", end = "\t")
                emp_id.print_info()
        sel = int(input("삭제할 인덱스번호를 선택하세요 : "))
        self.employeeList.remove(resultList[sel])
    
    def printAll(self):
        for e in self.employeeList:
            e.print_info()
        if len(self.employeeList) == 0:
            print("목록에 아무것도 없습니다.")
        return
    
    def start(self):
        funcList = [None, self.append, self.search, self.modify, self.remove, self.printAll]
        while True:
            print("1.추가, 2.검색, 3. 수정, 4. 삭제, 5. 출력, 0. 종료 : ")
            sel = int(input("번호를 선택하세요 : "))
            if sel not in [1,2,3,4,5,0]:
                print("다시 입력하세요")
            elif sel == 0:
                print("프로그램을 종료합니다.")
                break
            else:
                funcList[sel]()
                
if __name__ == "__main__":
    emgr = EmployeeManager()
    emgr.start()

재고관리시스템_객체지향

  • filter와 lambda가 아닌 for문을 돌려서 해봤다.
    전자가 더 코드가 간결해서 좋은 것 같다.
# 문제 설명
# 편의점에서 판매하는 상품들을 관리하기 위한 간단한 재고 관리 프로그램을 만들어보세요.
# 다음 기능을 포함해야 합니다.

# ✅ 클래스 구조
# 1. Product 클래스
# 속성: 상품명(name), 가격(price), 수량(quantity)
# print_info() : 상품 정보를 출력

# 2. InventoryManager 클래스
# 속성: 상품 리스트 (productList)
# 메서드:
# add_product() : 상품 추가
# search_product() : 상품 이름으로 검색
# update_product() : 수량 또는 가격 수정
# delete_product() : 상품 삭제
# print_all() : 전체 상품 정보 출력
# start() : 메뉴 반복 처리

# ✏️ 기능 예시
# 추가: 상품명, 가격, 수량을 입력받아 리스트에 추가
# 검색: 특정 이름이 포함된 상품을 출력
# 수정: 검색 후 가격 또는 수량을 선택해 변경
# 삭제: 이름 검색 후 해당 상품 삭제
# 출력: 현재 등록된 모든 상품 출력

class Product:
    def __init__(self, name, price, quantity):
        self.name = name
        self.price = price
        self.quantity = quantity
        
    def print_info(self):
        print(f"상품명 : {self.name}, 가격 : {self.price}, 수량 : {self.quantity}")
        
class InventoryManager:
    def __init__(self):
        self.productList = []
        
    def add_product(self):
        name = input("상품명 : ")
        price = int(input("가격 : "))
        quantity = int(input("수량 : "))
        product = Product(name, price, quantity)
        self.productList.append(product)
    
    def search_product(self): #상품추가
        name = input("검색할 상품 이름 : ")
        found = False
        for index, product in enumerate(self.productList):
            if name in product.name:
                print(f"{index}", end = "\t")
                product.print_info()
                found = True
        if not found:
            print("검색결과가 없습니다.")
    
    def update_product(self): #수량 또는 가격 수정
        name = input("수정할 상품 이름 : ")
        found = False
        for index, product in enumerate(self.productList):
            if name in product.name:
                print(f"{index}", end = "\t")
                product.print_info()
                found = True
        if not found:
            print("검색결과가 없습니다.")
        sel = int(input("수정할 상품의 인덱스 값을 입력 : "))
        item = self.productList[sel]
        item.quantity = int(input("새로운 수량 : "))
        item.price = int(input("새로운 가격 : "))
        print("수정완료!")
    
    def delete_product(self): #상품 삭제
        name = input("수정할 상품 이름 : ")
        found = False
        for index, product in enumerate(self.productList):
            if name in product.name:
                print(f"{index}", end = "\t")
                product.print_info()
                found = True
        if not found:
            print("검색결과가 없습니다.")
        sel = int(input("삭제할 상품의 인덱스 값을 입력 : "))
        del self.productList[sel]
        print("상품이 삭제되었습니다.")
    
    def print_all(self):
        if not self.productList:
            print("등록된 상품이 없습니다.")
        else:
            for product in self.productList:
                product.print_info()
    
    def start(self):
        func_list = [
            None,
            self.add_product,
            self.search_product,
            self.update_product,
            self.delete_product,
            self.print_all
        ]
        
        while True:
            print("\n1. 상품 추가")
            print("2. 상품 검색")
            print("3. 상품 수정")
            print("4. 상품 삭제")
            print("5. 전체 출력")
            print("0. 종료", end = "\n")
            
            sel = int(input("메뉴 번호 선택: "))
            
            if sel == 0:
                print("프로그램을 종료합니다.")
                break
            elif 1 <= sel <= 5:
                func_list[sel]()
            else:
                print("올바른 메뉴를 선택하세요.")

if __name__ == "__main__":
    ivm = InventoryManager()
    ivm.start()

0개의 댓글