Why projects, and how to pick one
Tutorials teach syntax; projects teach programming — deciding what to build, breaking it into steps, reading errors you caused, and finishing. Pick a project one notch above comfortable. Every idea below uses only the standard library, so it runs in the Coding Python app on Android as well as on a computer. Build the minimum version first, then add features from the checklist.
Easy (days 1–10 of learning)
1. Number guessing game
Learn: loops, conditions, random, input validation. Extras: difficulty levels, limited attempts, best-score tracking.
import random
secret = random.randint(1, 50)
for attempt in range(1, 8):
guess = int(input(f"Attempt {attempt} - guess: "))
if guess == secret:
print("Correct!"); break
print("Higher" if guess < secret else "Lower")
else:
print("Out of tries. It was", secret)
2. Tip and bill splitter
Learn: floats, rounding, f-string formatting. Extras: round each share up so the total is covered, handle currency symbols.
3. Rock, paper, scissors
Learn: dictionaries as lookup tables, game loop, score keeping.
import random
beats = {"rock": "scissors", "paper": "rock", "scissors": "paper"}
wins = losses = 0
while True:
me = input("rock/paper/scissors/quit: ").lower()
if me == "quit": break
if me not in beats: print("?"); continue
cpu = random.choice(list(beats))
if me == cpu: print("Draw", cpu)
elif beats[me] == cpu: wins += 1; print("Win!", cpu)
else: losses += 1; print("Lose.", cpu)
print(f"{wins} wins, {losses} losses")
4. Mad Libs story generator
Learn: strings, lists of prompts, string templates. Extras: several story templates chosen at random.
Medium (weeks 2–4)
5. To-do list saved to JSON
Learn: lists of dicts, json, file persistence, menu loop. Extras: due dates, priorities, mark done, search.
import json
from pathlib import Path
DB = Path("todos.json")
todos = json.loads(DB.read_text()) if DB.exists() else []
while True:
cmd = input("add/list/done/quit: ")
if cmd == "add": todos.append({"task": input("Task: "), "done": False})
elif cmd == "list":
for i, t in enumerate(todos): print(i, "[x]" if t["done"] else "[ ]", t["task"])
elif cmd == "done": todos[int(input("#: "))]["done"] = True
elif cmd == "quit": break
DB.write_text(json.dumps(todos, indent=2))
6. Quiz game from a question bank
Learn: nested data, shuffling, scoring, functions. Extras: categories, timer per question with time, high scores file.
7. Password generator and strength checker
Learn: random.choice, string module, set logic for character classes. Extras: exclude ambiguous characters, entropy estimate in bits.
import random, string, math
pool = string.ascii_letters + string.digits + "!@#$%^&*"
pw = "".join(random.choice(pool) for _ in range(16))
print(pw, f"~{len(pw) * math.log2(len(pool)):.0f} bits")
8. Expense tracker with monthly summary
Learn: datetime, csv, grouping with dicts, sorting. Extras: budget warnings, category totals, export.
9. Text adventure game
Learn: dictionaries describing rooms, state, parsing simple commands. Extras: inventory, locked doors, save/load with JSON.
Intermediate (month 2)
10. Hangman with a word list file
Learn: sets, string building, file reading, game state. Extras: ASCII-art gallows, difficulty by word length, hint system.
import random
word = random.choice(["python", "compiler", "android", "function"])
guessed, lives = set(), 6
while lives and not set(word) <= guessed:
print(" ".join(c if c in guessed else "_" for c in word), f"| lives: {lives}")
ch = input("letter: ").lower()
if ch in guessed: continue
guessed.add(ch)
if ch not in word: lives -= 1
print("You win!" if lives else f"You lose. It was {word}")
11. Contact book with a class and search
Learn: classes, __repr__, list of objects, JSON serialisation of objects, case-insensitive search. Extras: edit, delete, sort by name, validate phone numbers with re.
12. Markdown-style text statistics tool
Learn: reading files, collections.Counter, regex, formatting a report. Counts words, sentences, most common words, average sentence length and reading time. Extras: stop-word filtering, compare two files.
from collections import Counter
import re
text = open("essay.txt", encoding="utf-8").read()
words = re.findall(r"[a-zA-Z']+", text.lower())
sentences = re.split(r"[.!?]+", text)
print("Words:", len(words), "Sentences:", len(sentences) - 1)
print("Reading time:", round(len(words) / 200, 1), "min")
print(Counter(words).most_common(5))How to finish a project
- Write the smallest version that works end to end. Ugly is fine.
- Add one feature from the checklist. Run it. Repeat.
- Refactor repeated code into functions once you have three copies, not before.
- Add input validation and try/except around anything the user types.
- Write a short README comment at the top: what it does, how to run it.
Keep every finished project — they become a portfolio and a reference. When you are ready for more, the natural next steps are a web app with Flask or a data project with pandas on a computer.
Frequently asked questions
What is a good first Python project?
A number guessing game. It uses loops, conditions, random numbers and input in about ten lines, and you can keep adding features as you learn.
Can I build Python projects on my phone?
Yes. All twelve projects here use only the standard library, so they run in the Coding Python Android app, which supports multi-file projects and an interactive console.
How long should a beginner project take?
Easy projects take an hour or two; the medium ones a few evenings; intermediate ones a week of short sessions. Finishing matters more than speed.
Do I need external libraries for beginner projects?
No. The standard library covers files, JSON, CSV, dates, random numbers, regex and more. Add libraries later for web, data or graphics work.