Answer in brief
Start with a number guessing game: it needs only input, if, a loop and the random module, and it fits in one evening. Then move through projects that each add one new idea, such as lists, dictionaries, files, CSV and JSON, and finish with a file renamer built on pathlib, tested on copies first.
Choosing a first Python project you can finish in one evening
Most lists of python projects for beginners are ideas in random order. This one is ordered by the concept each project trains, so every build adds one new thing: input and if, then loops and lists, dictionaries, files and finally the standard library modules that do real work. Each entry gives the features it practises, a stretch goal and the usual mistake.
The rule for choosing is simple. Take a project that uses only what you already know plus one new idea, and cut its scope until the first working version fits a single evening. A to-do list that adds and removes items is a project; one with users and reminders is a month. Build the smallest version first and keep the stretch goal for a second evening. The Python tutorial says it does not try to cover every feature, or even every commonly used one, and points to the standard library reference for the rest; one page of that reference per project is part of the exercise.
Guessing game, tip calculator and rock-paper-scissors for input and if
The number guessing game is the classic first python project. The program picks a number with random.randint, which per the Python documentation returns an integer between a and b with both ends included, then asks for guesses and answers higher or lower. It trains input, int conversion, comparison and a while loop. The stretch goal is a counter of attempts and a limit of seven tries.
Its usual mistake teaches the key skill of the whole list. The built-in input always returns a string, so comparing it to a number fails, and typing a word into int raises an error. The official tutorial shows the cure: a while True loop around a try block that converts the answer, with an except ValueError branch that asks again. It also explains how to read the error itself: the last line of the message says what happened, and the stack traceback above it shows where.
The tip calculator asks for a bill, a percentage and the number of people, then prints each share with an f-string to two decimal places. One surprise: the built-in functions page notes that round(2.675, 2) gives 2.67, not 2.68, because most decimal fractions cannot be stored exactly as floats. Rock-paper-scissors then adds random.choice and a chain of if and elif branches; the stretch goal is a best-of-five score.
Dice histogram, countdown timer and dictionary quiz for loops
The dice simulator rolls two dice ten thousand times with a for loop and range, stores how often each total appears and prints a text histogram, one row of hash signs per total. It trains loops, lists and counting, and shows that seven comes up far more often than two or twelve. The stretch goal is to ask the user for the number of dice and rolls. The usual mistake is an off-by-one list that has no slot for the highest total.
The countdown timer prints the remaining time once a second using time.sleep. The time module documentation warns that the pause may be longer than requested by an arbitrary amount, because the system schedules other work, so a long countdown that only sleeps will drift. The stretch goal fixes that: record a start value from time.monotonic, a clock that the docs say cannot go backwards, and compute the remaining time from it on every pass.
The quiz keeps questions as dictionary keys and answers as values, loops over the items, compares answers after lower and strip and prints a score. It is the first project where data and logic live apart, a habit that makes later programs easy to change. Stretch goal: shuffle the question order with random.shuffle on a list of the keys, and save the best score.
Word counter and unit converter for strings, dicts and functions
The word counter reads a text file and reports characters, words, lines, average word length and the ten most frequent words. Build the first version with split and a plain dictionary, then rebuild it with collections.Counter, which the documentation describes as a dict subclass for counting hashable objects. Its own example finds the ten most common words in Hamlet by lowering the text, extracting words with a regular expression and calling most_common. The usual mistake is counting The and the as different words, which lowering the text first prevents; the stretch goal is a list of short words to ignore.
The unit converter is the project that teaches functions. Store conversion factors in a dictionary keyed by unit pair, write one function that takes a value and two units and returns the result, and keep all printing outside it. Temperatures need their own function, since Celsius to Fahrenheit needs an offset as well as a factor. Stretch goal: a loop that keeps converting until the user types quit.
A password generator built on secrets rather than random
Here the choice of module matters. The random module documentation carries a warning that its generators should not be used for security purposes and sends the reader to secrets. The secrets documentation explains why: random is designed for modelling and simulation, not security or cryptography, while secrets produces cryptographically strong values for passwords, tokens and similar data. The module has been part of Python since version 3.6.
The build follows the recipe on that page. Join string.ascii_letters and string.digits into an alphabet, pick characters with secrets.choice in a loop and join them into the password. The documentation then shows a stricter version that keeps generating a ten-character password until it holds at least one lowercase letter, one uppercase letter and three digits. Your stretch goal is to let the user choose the length and whether to add string.punctuation, then print several candidates at once.
To-do list, expense tracker and contact book that save to files
A to-do list in a text file trains opening, reading and writing. The tutorial recommends the with statement for files because the file is closed properly even when an exception happens, and it spells out the modes: r reads, a appends to the end, and w erases an existing file of the same name. The usual mistake: opening the list in w mode to add one task wipes the others. Stretch goal: number the tasks and delete one by its number.
The expense tracker writes date, category and amount to a CSV file and prints a total per category. The csv documentation asks for files opened with newline set to an empty string; without it, newlines inside quoted fields are misread and, on platforms that end lines with a carriage return and a line feed, an extra carriage return is written. Use DictWriter, whose fieldnames argument is not optional, and writeheader once. Because the floating-point chapter of the tutorial points accounting work to the decimal module, use Decimal for the amounts as a stretch goal.
The contact book keeps people in a dictionary and saves it with json.dump, with indent set for readability. The json documentation warns that every key becomes a string on the way out, so a dictionary with numeric keys does not come back equal to the original. It also escapes non-ASCII letters by default, so names like José stay readable only with ensure_ascii set to False. Turning each contact into a class with its own methods is the stretch goal.
A file renamer with pathlib, plus the habits that hold a project together
The file renamer gives a folder of photos or scans names such as holiday-001.jpg. It uses pathlib, where Path.iterdir lists a folder, Path.suffix gives the extension and with_suffix or with_name builds the new name. The pathlib documentation warns that iterdir and glob return files in arbitrary order, so sort them before numbering. It also says rename silently replaces an existing file on Unix but raises FileExistsError on Windows. Run every version on a copy of the folder, with a dry-run mode that only prints the planned names.
A few habits from PEP 8, the Python style guide, are worth adopting from the first project: four spaces per indentation level, lines of at most 79 characters, function and variable names in lowercase with underscores, class names in CapWords and imports at the top of the file. Its reasoning is that code is read much more often than it is written. The __main__ page of the documentation adds one more habit: put the program in a main function and call it under the if __name__ check, so the file can be imported without running.
None of these projects needs a third-party package. When one does, the venv documentation describes creating an environment in the project folder with python -m venv .venv, activating it and keeping it out of version control, recording packages in requirements.txt instead. Putting finished projects on GitHub is good practice in commits and readmes; GitHub Docs explain how a .gitignore file in the repository root tells Git what to skip, and that GitHub keeps a public list of recommended templates.
What to practise alone and what the free Python course adds
Alone, this week, pick one project from each of the first three groups and finish them in order, one evening each. Read every traceback from the bottom line up before searching for it and write down each fix in a notes file. The Beginner's Guide on the Python wiki also links a page of small example programs if you want more ideas at the same level.
A structured course adds order and checking. The free VITON13 SCHOOL Python course has 16 lessons that run in the browser, with nothing to install: first program, variables, numbers, strings and f-strings, if and elif, lists, for and while loops, functions, dictionaries, tuples and sets, list comprehensions, try and except, classes, modules, and a final text statistics project. Each lesson shows an example, asks you to write code, shows the result at once and checks the exercise on the page. Those lessons cover the ideas behind the first three groups of python projects for beginners, and the final text statistics project is the same idea as the word counter; file work then comes from the projects and the documentation.
Practical checklist
- Write down the smallest working version of your project in three sentences before you open the editor.
- Wrap every int(input()) call in a try block with an except ValueError branch that asks again.
- Use secrets.choice, never random, for anything that will be used as a password or token.
- Open CSV files with newline set to an empty string and never open a list you are adding to in w mode.
- Copy the folder before running a file renamer, and run a dry-run that only prints the new names first.
Questions and answers
What should be my first project in Python?
A number guessing game. It needs only input, int, if and a while loop plus one function from the random module, it fits in an evening, and its one real trap, a word typed where a number was expected, teaches try and except and how to read a traceback.
How difficult are these Python projects for a complete beginner?
The first group needs only the basics covered in the opening chapters of the official tutorial. Difficulty grows with each group because each one adds a single new idea, so a reader who finishes them in order never meets two unfamiliar things in the same program.
Which beginner Python projects are the most useful afterwards?
The expense tracker and the file renamer. One gives you a CSV file you can open in a spreadsheet; the other tidies real folders of photos or scans. Both are worth keeping, provided the renamer is tried on copies and has a dry-run mode.
Do I need to install packages or set up a virtual environment for these projects?
No. All thirteen use only the standard library that ships with Python. A virtual environment becomes useful the day a project needs a third-party package; the venv documentation explains how to create one inside the project folder and keep it out of Git.
Why does my Python password generator need the secrets module?
Because the Python documentation says the random module is built for modelling and simulation and should not be used for security. The secrets module produces cryptographically strong choices and its documentation includes a ready recipe for an alphanumeric password.
