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.

Build these projects in the app's multi-file editor — the Coding Python app runs real Python 3 on your phone, with examples, quizzes and challenges built in.
Get it free

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

  1. Write the smallest version that works end to end. Ugly is fine.
  2. Add one feature from the checklist. Run it. Repeat.
  3. Refactor repeated code into functions once you have three copies, not before.
  4. Add input validation and try/except around anything the user types.
  5. 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.