Learn by building. Each challenge introduces new concepts through a real problem.
Solve independently, compare solutions, discuss tradeoffs.
| # |
Challenge |
Concepts |
| 001 |
Menu-Based Calculator |
I/O, loops, conditionals, functions, basic math |
| 002 |
Contact Book |
Dictionaries, lists, CRUD, input validation |
| 003 |
Hangman Game |
Strings, sets, random, game loops, ASCII art |
| 004 |
Word Frequency Counter |
File I/O, string methods, sorting, formatting |
| 005 |
Expense Tracker |
Lists of dicts, date handling, filtering, f-strings |
| # |
Challenge |
Concepts |
| 006 |
Student Grade System |
Classes, init, methods, encapsulation |
| 007 |
Bank Account System |
Inheritance, polymorphism, dunder methods |
| 008 |
Library Manager |
Composition, class relationships, search/filter |
| 009 |
CSV Data Analyzer |
csv module, data processing, statistics |
| 010 |
Password Vault |
Error handling, JSON, hashlib, try/except design |
| # |
Challenge |
Concepts |
| 011 |
Data Transformer |
List/dict/set comprehensions, nested comprehensions |
| 012 |
Log File Parser |
Regular expressions, pattern matching, groups |
| 013 |
Custom Collections |
Generators, iterators, iter, next, yield |
| 014 |
Function Toolkit |
Closures, decorators, functools, higher-order fns |
| 015 |
Plugin System |
Modules, packages, imports, init.py, dynamic loading |
| # |
Challenge |
Concepts |
| 016 |
CLI Task Manager |
argparse, project structure, pip packaging |
| 017 |
REST API Client |
requests, JSON APIs, error handling, retries |
| 018 |
Database CRUD App |
sqlite3, SQL basics, context managers |
| 019 |
Test Suite Challenge |
unittest, pytest, mocking, TDD workflow |
| 020 |
Type-Safe Config Loader |
Type hints, dataclasses, protocols, validation |
| # |
Challenge |
Concepts |
| 021 |
Async Web Scraper |
asyncio, aiohttp, coroutines, gather |
| 022 |
Chat Server |
Threading, sockets, producer-consumer pattern |
| 023 |
Mini ORM |
Metaclasses, descriptors, getattr, magic |
| 024 |
Data Pipeline |
Generators pipelines, itertools, memory efficiency |
| 025 |
Build Your Own pytest |
Introspection, ast module, dynamic dispatch |
- No skipping -- each challenge builds on previous ones
- Both solve independently before comparing
- Get it working first, then refactor for clean code
- Each solution should have a
if __name__ == "__main__": block
- Write at least 3 test cases per challenge (from challenge 019 onward, use pytest)
- After comparing solutions, write a brief
learnings.md in your folder
- 1-2 challenges per week = solid pace
- Spend time on the comparison -- that's where real learning happens
- If a challenge feels too easy, do the bonus objectives
- If stuck for 30+ min, pseudocode first, then code