📚 도서 관리 시스템: 리스트와 반복문 실습 예제
✅ 학습 목표
이 실습 예제를 통해 다음 개념을 익힐 수 있습니다:
• 리스트(List)의 활용
• 딕셔너리(Dictionary)와 함께 사용하는 리스트
• 반복문(for, while)의 실전 적용
• 조건문(if)과 리스트 검색
• 사용자 입력 처리
🧩 예제 소개
도서 관리 시스템은 도서 목록을 관리하고, 검색하거나, 대출/반납 기록을 저장하는 프로그램입니다. 실습을 통해 리스트에 데이터를 추가하거나 반복문을 통해 목록을 출력하는 등의 기능을 구현해 볼 수 있습니다.
🔸 1. 도서 리스트 구성
도서는 딕셔너리로 구성되어 있으며, 여러 권의 책을 리스트로 관리합니다.
books = [
{"id": 1, "title": "파이썬 프로그래밍 기초", "author": "김파이", "status": "대출 가능"},
{"id": 2, "title": "리스트와 반복문의 모든 것", "author": "이루프", "status": "대출 가능"},
{"id": 3, "title": "데이터 분석 입문", "author": "박데이터", "status": "대출 중"}
]
이처럼 리스트 안에 딕셔너리를 넣어, 각각의 책 정보를 담고 관리합니다.
🔸 2. 도서 목록 전체 출력
for 반복문을 사용하여 모든 도서를 출력할 수 있습니다.
for book in books:
print(f"{book['id']} | {book['title']} | {book['author']} | {book['status']}")
💡 설명:
• books 리스트를 순회하면서 각 book 딕셔너리를 가져옵니다.
• book['title']처럼 딕셔너리의 값을 꺼내 출력합니다.
🔸 3. 도서 검색 (리스트 컴프리헨션)
사용자가 입력한 검색어에 따라, 제목 또는 저자 이름에 해당 키워드가 포함된 책을 찾습니다.
keyword = input("검색어를 입력하세요: ")
found_books = [book for book in books if keyword in book['title'] or keyword in book['author']]
💡 리스트 컴프리헨션:
• 리스트를 새로 만들면서 조건에 맞는 항목만 골라낼 수 있습니다.
• 위 코드는 keyword가 포함된 책만 새 리스트에 담습니다.
🔸 4. 도서 추가
리스트에 새 도서 정보를 append() 메서드로 추가합니다.
new_book = {
"id": max(book['id'] for book in books) + 1,
"title": input("제목 입력: "),
"author": input("저자 입력: "),
"status": "대출 가능"
}
books.append(new_book)
💡 설명:
• max()와 리스트 컴프리헨션을 이용해 가장 큰 ID를 찾아서 새로운 ID를 자동 생성합니다.
• append()는 리스트 끝에 새 요소를 추가하는 메서드입니다.
🔸 5. 도서 대출 및 반납 처리
특정 도서를 찾기 위해 for 반복문을 사용하고, 조건문으로 대출 상태를 확인합니다.
book_id = int(input("도서 ID를 입력하세요: "))
for book in books:
if book['id'] == book_id:
if book['status'] == "대출 가능":
book['status'] = "대출 중"
print("도서를 대출했습니다.")
else:
book['status'] = "대출 가능"
print("도서를 반납했습니다.")
break
🔸 6. 대출/반납 기록 저장
대출/반납 시 기록을 리스트에 추가해 추후 확인이 가능합니다.
loan_history = []
loan_record = {
"book_id": book_id,
"title": book['title'],
"action": "대출",
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
loan_history.append(loan_record)
📌 마무리: 리스트와 반복문의 조화
이 예제를 통해 여러분은 다음과 같은 Python 기법을 실전에서 익혔습니다.
개념 | 적용 예시 |
리스트 | books, loan_history 등 데이터 저장 |
반복문 (for) | 도서 전체 출력, 도서 검색 등 |
리스트 컴프리헨션 | 조건에 맞는 도서 검색 |
딕셔너리 | 각 도서의 정보를 저장하는 구조 |
append() | 리스트에 새 항목 추가 |
조건문 (if) | 대출 상태 확인 및 처리 |
🔍 도전 과제
• 책 제목을 오름차순 또는 내림차순 정렬해 출력해 보세요.
• 특정 저자가 쓴 모든 책을 모아보는 기능을 만들어 보세요.
• 반납 기한이 지난 도서를 찾아 경고 메시지를 출력하도록 개선해 보세요.
전체 소스코드
import os
import sys
import time
from datetime import datetime
# 화면 지우기 함수
def clear_screen():
if sys.platform == 'win32':
os.system('cls')
else:
os.system('clear')
# 초기 도서 목록
books = [
{"id": 1, "title": "파이썬 프로그래밍 기초", "author": "김파이", "status": "대출 가능"},
{"id": 2, "title": "리스트와 반복문의 모든 것", "author": "이루프", "status": "대출 가능"},
{"id": 3, "title": "데이터 분석 입문", "author": "박데이터", "status": "대출 중"},
{"id": 4, "title": "알고리즘의 이해", "author": "최알고", "status": "대출 가능"},
{"id": 5, "title": "웹 개발 첫걸음", "author": "정웹", "status": "대출 중"}
]
# 대출 기록 리스트
loan_history = []
# 도서 관리 시스템 메인 루프
def book_management_system():
while True:
clear_screen()
print("\n" + "=" * 50)
print(" " * 15 + "도서 관리 시스템")
print("=" * 50)
print("\n1. 전체 도서 목록 보기")
print("2. 도서 검색")
print("3. 새 도서 추가")
print("4. 도서 대출/반납")
print("5. 대출 기록 보기")
print("6. 프로그램 종료")
print("\n" + "=" * 50)
choice = input("\n메뉴를 선택하세요 (1-6): ")
if choice == '1':
show_all_books()
elif choice == '2':
search_book()
elif choice == '3':
add_new_book()
elif choice == '4':
loan_return_book()
elif choice == '5':
show_loan_history()
elif choice == '6':
print("\n프로그램을 종료합니다.")
time.sleep(1)
break
else:
print("\n잘못된 선택입니다. 다시 시도해주세요.")
time.sleep(1.5)
def show_all_books():
clear_screen()
print("\n" + "=" * 70)
print(" " * 25 + "전체 도서 목록")
print("=" * 70)
print(f"{'ID':^5}|{'제목':^30}|{'저자':^15}|{'상태':^15}")
print("-" * 70)
for book in books:
print(f"{book['id']:^5}|{book['title']:^30}|{book['author']:^15}|{book['status']:^15}")
input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")
def search_book():
clear_screen()
print("\n" + "=" * 50)
print(" " * 15 + "도서 검색")
print("=" * 50)
keyword = input("\n검색어를 입력하세요 (제목 또는 저자): ")
found_books = [book for book in books if keyword.lower() in book['title'].lower() or keyword.lower() in book['author'].lower()]
if found_books:
print("\n검색 결과:")
print(f"{'ID':^5}|{'제목':^30}|{'저자':^15}|{'상태':^15}")
print("-" * 70)
for book in found_books:
print(f"{book['id']:^5}|{book['title']:^30}|{book['author']:^15}|{book['status']:^15}")
else:
print("\n검색 결과가 없습니다.")
input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")
def add_new_book():
clear_screen()
print("\n" + "=" * 50)
print(" " * 15 + "새 도서 추가")
print("=" * 50)
new_id = max(book['id'] for book in books) + 1
title = input("\n제목을 입력하세요: ")
author = input("저자를 입력하세요: ")
new_book = {"id": new_id, "title": title, "author": author, "status": "대출 가능"}
books.append(new_book)
print(f"\n'{title}' 도서가 성공적으로 추가되었습니다.")
input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")
def loan_return_book():
clear_screen()
print("\n" + "=" * 50)
print(" " * 15 + "도서 대출/반납")
print("=" * 50)
book_id = input("\n도서 ID를 입력하세요: ")
try:
book_id = int(book_id)
found = False
for book in books:
if book['id'] == book_id:
found = True
now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if book['status'] == "대출 가능":
book['status'] = "대출 중"
loan_record = {"book_id": book_id, "title": book['title'], "action": "대출", "time": now_time}
loan_history.append(loan_record)
print(f"\n'{book['title']}' 도서가 성공적으로 대출되었습니다.")
else:
book['status'] = "대출 가능"
return_record = {"book_id": book_id, "title": book['title'], "action": "반납", "time": now_time}
loan_history.append(return_record)
print(f"\n'{book['title']}' 도서가 성공적으로 반납되었습니다.")
break
if not found:
print("\n해당 ID의 도서를 찾을 수 없습니다.")
except ValueError:
print("\n유효한 숫자를 입력하세요.")
input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")
def show_loan_history():
clear_screen()
print("\n" + "=" * 70)
print(" " * 25 + "대출/반납 기록")
print("=" * 70)
if loan_history:
print(f"{'ID':^5}|{'제목':^30}|{'동작':^10}|{'시간':^20}")
print("-" * 70)
for record in reversed(loan_history):
print(f"{record['book_id']:^5}|{record['title']:^30}|{record['action']:^10}|{record['time']:^20}")
else:
print("\n대출/반납 기록이 없습니다.")
input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")
# 실행 시작
if __name__ == "__main__":
book_management_system()
'코딩교육 > Python 초등교육에서 전문가까지' 카테고리의 다른 글
2단계 : 6. 파일 읽기 - read(), readline(), readlines() (0) | 2025.03.28 |
---|---|
2단계 : 6. 텍스트 파일 열기 (open() 함수와 파일 모드) (0) | 2025.03.27 |
2단계 : 5. 리스트와 반복문 (리스트 컴프리헨션의 소개 - 기본 활용법) (0) | 2025.03.25 |
2단계 : 5. 리스트와 반복문 (리스트와 반복문 - for 문을 활용한 리스트 순회) (0) | 2025.03.24 |
2단계 : 5. 리스트와 반복문 (리스트와 관련된 주요 메서드 - append(), remove(), sort() 등) (0) | 2025.03.23 |