꼭 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("작업완료")
# 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)
#한사람 정보 - 데이터베이스 레코드 하나
#파이썬의 경우는 파일명과 클래스명은 아무 관계없다.
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()
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()
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()
# 📘 문제: 영화 예매 시스템
# 요구사항
# 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()
# 문제 설명
# 편의점에서 판매하는 상품들을 관리하기 위한 간단한 재고 관리 프로그램을 만들어보세요.
# 다음 기능을 포함해야 합니다.
# ✅ 클래스 구조
# 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()