Capstone Python Mini Projects
🔴 Advanced
📖 Definition
Apply functions, Object-Oriented Programming (OOP), Dataclasses, Collections, Exception Handling, File I/O, JSON, CSV processing, and Unit Testing to build complete, functional, real-world Python applications.
🇮🇳 Hindi
Ab tak seekhe gaye sabhi Python concepts (Variables, Loops, Functions, OOP, Exception Handling, JSON, CSV) ko combine karke full real-world practical applications create karein.
🚩 Marathi
Aapn shiklele sarv Python concepts ektra karun practical interactive apps banva.
🏗️ Project 1: Interactive To-Do Manager CLI with JSON Persistence
A complete, interactive command-line application featuring Dataclasses, JSON storage, and input validation.
import json
import os
from dataclasses import dataclass, asdict
from typing import List
# 1. Data Model
@dataclass
class Task:
task_id: int
title: str
completed: bool = False
# 2. Task Manager Class
class TaskManager:
def __init__(self, db_path: str = "tasks_db.json"):
self.db_path = db_path
self.tasks: List[Task] = []
self._load_tasks()
def _load_tasks(self) -> None:
if os.path.exists(self.db_path):
try:
with open(self.db_path, "r", encoding="utf-8") as f:
data = json.load(f)
self.tasks = [Task(**item) for item in data]
except Exception as e:
print(f"Error loading tasks: {e}")
def _save_tasks(self) -> None:
try:
with open(self.db_path, "w", encoding="utf-8") as f:
json.dump([asdict(t) for t in self.tasks], f, indent=4)
except Exception as e:
print(f"Error saving tasks: {e}")
def add_task(self, title: str) -> None:
new_id = max([t.task_id for t in self.tasks], default=0) + 1
task = Task(task_id=new_id, title=title)
self.tasks.append(task)
self._save_tasks()
print(f"Task Added : #{task.task_id} - '{task.title}'")
def toggle_task(self, task_id: int) -> None:
for t in self.tasks:
if t.task_id == task_id:
t.completed = not t.completed
self._save_tasks()
status = "COMPLETED" if t.completed else "PENDING"
print(f"Task #{task_id} marked as {status}.")
return
print(f"Task #{task_id} not found.")
def list_tasks(self) -> None:
print("\n=== CURRENT TO-DO LIST ===")
if not self.tasks:
System.out.println("No tasks found.") if False else print("No tasks in list.")
return
for t in self.tasks:
status = "[✔]" if t.completed else "[ ]"
print(f"{status} #{t.task_id} : {t.title}")
# 3. Running Application Demo
if __name__ == "__main__":
manager = TaskManager("demo_tasks.json")
print("=== TO-DO MANAGER CLI ===")
manager.add_task("Master Python OOP & Dataclasses")
manager.add_task("Practice Decorators and Generators")
manager.list_tasks()
manager.toggle_task(1)
manager.list_tasks()
# Cleanup demo DB file
if os.path.exists("demo_tasks.json"):
os.remove("demo_tasks.json")
👀 Output
=== TO-DO MANAGER CLI ===
Task Added : #1 - 'Master Python OOP & Dataclasses'
Task Added : #2 - 'Practice Decorators and Generators'
=== CURRENT TO-DO LIST ===
[ ] #1 : Master Python OOP & Dataclasses
[ ] #2 : Practice Decorators and Generators
Task #1 marked as COMPLETED.
=== CURRENT TO-DO LIST ===
[✔] #1 : Master Python OOP & Dataclasses
[ ] #2 : Practice Decorators and Generators
🏗️ Project 2: Password Generator & Strength Validator
import random
import string
import re
def generate_password(length: int = 12, include_symbols: bool = True) -> str:
"""Generates a cryptographically strong random password."""
letters = string.ascii_letters
digits = string.digits
symbols = "!@#$%^&*()_+"
character_pool = letters + digits + (symbols if include_symbols else "")
# Ensure at least 1 uppercase, 1 lowercase, 1 digit
password = [
random.choice(string.ascii_uppercase),
random.choice(string.ascii_lowercase),
random.choice(string.digits)
]
if include_symbols:
password.append(random.choice(symbols))
# Fill remaining characters
while len(password) < length:
password.append(random.choice(character_pool))
random.shuffle(password)
return "".join(password)
def evaluate_password_strength(password: str) -> str:
"""Evaluates password strength using Regex pattern checks."""
if len(password) < 8:
return "WEAK (Too Short)"
has_upper = bool(re.search(r"[A-Z]", password))
has_lower = bool(re.search(r"[a-z]", password))
has_digit = bool(re.search(r"\d", password))
has_symbol = bool(re.search(r"[!@#$%^&*()_+]", password))
score = sum([has_upper, has_lower, has_digit, has_symbol])
if score == 4 and len(password) >= 12:
return "VERY STRONG"
elif score >= 3:
return "STRONG"
else:
return "MODERATE"
# Test Execution
print("=== PASSWORD GENERATOR & VALDIATOR ===")
pwd = generate_password(14, include_symbols=True)
strength = evaluate_password_strength(pwd)
print(f"Generated Password : {pwd}")
print(f"Security Rating : {strength}")
👀 Output
=== PASSWORD GENERATOR & VALDIATOR ===
Generated Password : aK9#mQ2$pL5!xR
Security Rating : VERY STRONG
🧭 Navigation
| ← Python Home | ← Previous: Project Structure | Next: Asynchronous Programming → |