Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Grow Your Python Portfolio With 13 Intermediate Project Ideas
Learning the basics of Python is a wonderful experience. But the euphoria of just learning can be replaced by the hunger for hands-on projects. It’s normal to want to build projects, hence the need for project ideas.
The problem though is that some projects are either too simple for an intermediate Python developer or too hard. This article will suggest projects you can work on as an intermediate Python developer. These project ideas will provide the appropriate level of challenge for you.
In this article, you’ll learn:
- The importance of building projects
- The major platforms you can build projects for
- Thirteen project ideas you can work on
- Some tips for working on projects
Free Bonus: 5 Thoughts On Python Mastery, a free course for Python developers that shows you the roadmap and the mindset you’ll need to take your Python skills to the next level.
The Importance of Building Projects
Working on projects is vital to pushing your career as a Python developer forward. They make you apply the skills and knowledge you’re acquiring.
Projects can help you:
Build confidence: You will believe more in your ability to create software regardless the level of complexity.
Explore other technologies: You will learn about other technologies needed in building a complete product such as databases, servers, and other languages.
Understand programming concepts better: You will learn to write code better and understand concepts such as design patterns and object-oriented programming.
Experience a complete software development life cycle: You will learn how to plan before writing code, manage the coding process and update software.
There is a lot to gain from building projects as a Python developer.
Choosing a Project Platform
You need to build your software to run on a platform so that people who lack certain technical knowledge can use your software. The web, desktop, and command-line are the three major platforms you’ll want to build your projects for.
Web applications are applications that run on the web, they can be accessed on any device without being downloaded, provided there is access to the internet. If you want your projects to be accessible by everyone with internet access, it needs to be a web application.
A web application has a back end and front end. The back end is the part where the business logic is: your back-end code will manipulate and store data. The front end is the interface of the application: your front-end code will determine the look of a web application.
Another option is to use Python for both the front end and back end. Thanks to the
You can build web applications with Python through web frameworks such as
flask. The list of frameworks for building web applications using Python is long. There are plenty to choose from, but
flask remain the most popular web frameworks.
Every time you perform a task on your PC, be it a desktop or laptop, it is through an application. As an intermediate Python developer, you can make your own desktop applications.
You do not have to learn any front-end technology to create your own Graphical User Interface (GUI) applications, as you saw with web applications. You can build all the parts using Python.
There are frameworks for building your desktop applications.
PySimpleGUI is one of them, and it’s pretty user-friendly for an intermediate Python developer.
An advanced GUI framework like
PyQt5 is quite powerful, but it may have a steep learning curve.
The software you create for the Desktop GUI is able to work on any of the Windows, Linux, or Mac operating systems. All you have to do after creating the project is compile it to an executable for your operating system of choice.
Command-line applications are those applications that work in a console window. This is the command prompt on Windows and the Terminal on Linux and Mac.
You’d click to use a web or GUI application, but you’d type in commands for command-line applications. Users of command-line applications need to have some technical knowledge since they’ll need to use commands.
Command-line applications may not be as beautiful or easy to use as web or GUI applications, but that doesn’t make them less powerful than web or GUI applications.
You can improve the look of your command-line applications by applying colors to the text. There are libraries you can use for coloring, such as
colored. You can spice things up and use some color.
You can use frameworks such as
click to build your applications.
Web Project Ideas
In this section, you’ll see project ideas for the web. These project ideas can be classified as utility and education tools.
Here are the project ideas:
- Content Aggregator
- Regex Query Tool
- URL Shortener
- Post-It Note
- Quiz Application
Content is king. It exists everywhere on the web, from blogs to social media platforms. To keep up, you need to search for new information on the internet constantly. One way to stay updated is to check all the sites manually to see what the new posts are. But this is time consuming and quite tiring.
This is where the content aggregator comes in: A content aggregator fetches information from various places online and gathers all of that information in one place. Therefore, you don’t have to visit multiple sites to get the latest info: one website is enough.
Note: Follow this project-based tutorial to build a content aggregator for podcasts with Python and Django. Using custom management commands, feedparser, and django-apscheduler, you’ll set up an app to periodically parse RSS feeds for Python podcasts and display the latest episodes to your users.
With the content aggregator, all of the latest information can be gotten from one site that aggregates all the content. People can see the posts that interest them and can decide to find out more about them without traipsing all over the internet.
Examples of Content Aggregators
Here are some implementations of the Content Aggregator idea:
The main objective of this project idea is to aggregate content. First, you need to know what sites you’ll want the Content Aggregator to get content from. Then, you can use libraries such as
requests for sending HTTP requests and
BeautifulSoup to parse and scrape the necessary content from the sites.
Your application can implement its content aggregation as a background process. Libraries such as
apscheduler can help with that. You can try out
apscheduler. It’s great for small background processes.
After scraping content from various sites, you’ll need to save it somewhere. So, you’ll use a database to save the scraped content.
For a tougher challenge, you can add more websites. This will help you learn how to study and extract information from websites.
You can also have users subscribe to certain sites that you aggregate. Then, at the end of the day, the content aggregator will send the articles for that day to the email address of the user.
Regex Query Tool
You and I deal with text daily. This article, which is also text, has a structure. This makes it easier for you to understand. Sometimes, you need to find certain information in text, and using the regular search tool in text editors can be ineffective.
This is where the Regex Query Tool comes in. A regex is a set of strings, so the regex query tool will check for the validity of the queries. When the regex matches patterns in the text, it tells the user and highlights the matched patterns. So, your Regex Query Tool will check the validity of the regex strings passed in by the user.
With the Regex Query Tool, users can quickly check the validity of their regex strings on the web. This makes it easier for them, instead of having to check the strings with a text editor.
Examples of Regex Query Tools
Here are some implementations of the Regex Query Tool idea:
The main objective of this type of project is to tell the user the validity of the inputted query strings. You can make it give a positive or negative response such as
Query String Is Valid and
Query String Is Invalid, implementing the positive response in green and the negative in red.
You don’t have to implement the query tool from scratch. You can use Python’s standard
re library, which you can use to run the query strings on the inputted text. The
re library will return
None when the query string matches nothing, and it’ll return the matched strings when positive.
Some users may not understand regex fully, so you can make a page to explain how regex works. You can make documentation that is interesting enough to keep the users excited about learning and understanding regex.
Making a project that just returns the validity of the regex is fine. But you can also add a replacement feature. This means the application will check for the validity of the regex and also allow users to replace the matched strings with something else. So the tool is no longer a find tool but also a replace tool.
URLs can be extremely long and not user-friendly. When people share links or even try to remember a URL, it’s difficult because most URLs are filled with more difficult characters and don’t form meaningful words.
This is where the URL Shortener comes in. A URL Shortener reduces the characters or letters in a URL, making them easier to read and remember. A URL like
xyz.com/wwryb78&svnhkn%sghq?sfiyh can be shortened to
With the URL Shortener, URLs become a joy to work with.
Examples of URL Shorteners
Here are some implementations of the URL Shortener idea:
The main objective of this project idea is to shorten URLs. The main task the application will accomplish is to shorten URLs and then redirect users to the original URL when the shortened URL is visited.
Note: If you’d like to jump into building a URL shortener with step-by-step support, then check out Build a URL Shortener With FastAPI and Python.
In the application, the users will input the original URL, and they will get the new, shortened URL as the result. To do this, you can use a combination of the
string modules to generate the characters for the shortened URL.
Since users will visit the shortened URL days, months, or even years after, you’ll need to save the original and shortened URLs in a database. When a request comes in, the application checks if the URL exists and redirects to the original, or else it redirects to a 404 page.
Generating a shortened URL with random characters makes for a better URL than the long, random ones. But, you can make the result better for the users. You can add a feature to customize URLs, so the users can customize the generated URLs themselves.
Without a doubt, a custom
xyz.com/mysite URL is better than a randomly generated
It’s human to have many thoughts and ideas in a day, but it’s also human to forget. One way to work around forgetting things is to jot them down before they disappear into thin air. While some of forgotten thoughts and ideas may be trivial, some can be quite powerful.
This is where a Post-It note comes in: A Post-It note is a small paper with low-tack adhesive at the back, making it attachable to surfaces such as documents, walls. Post-It notes make it easier to jot things down. The Post-It note project idea is something similar. It allows users to jot things down, making them accessible anywhere, since it’s a web application.
With the Post-It note, people can now jot things down anywhere, without the fear of forgetting things or misplacing the notes—which is a possibility with physical notes.
Examples of Post-It Notes
Here are some implementations of the Post-It Note idea:
The main objective of this project is to allow users to jot down thoughts. This means that each user will have their own notes, so the application will need to have an account creation feature. This ensures that the notes of each user remain private to them.
django comes with a user authentication system, so it may be a good choice. You can use other frameworks like
flask, but you’ll have to implement the user authentication system on your own.
Since users may need to separate their notes under different sections, implementing a feature to allow users to categorize their notes will make the application more useful.
As an example, you may need to have notes on algorithms and data structures, so you’ll need to be able to separate the notes in those categories.
You’ll need to store the information and notes of each user, so a database becomes an essential part of this project. The
MySQLdb module can be used if you want to use a MySQL database or the
psycopg2 module for a PostgreSQL database. There are other modules you can use, but it all depends on the database you choose to use.
Since it’s human for users to forget their ideas, it’s also human for them to forget that they even made a note somewhere. You can add a feature to remind users of their notes. This feature will allow users to set a time for the reminder, so the application will send the reminder to the users when it’s time, by email.
Knowledge is power. There are so many things in the world to learn, and quizzes help in testing the understanding of those concepts. You, as an intermediate Python developer, do not have to understand everything about the language. Taking tests is one way to find out things you don’t fully understand.
Note: If you’d like to build a quiz step by step, you can check out Build a Quiz Application With Python.
This is where the Quiz Application comes in. The Quiz Application will present questions to the users and expect the right answers to those questions. Think of the Quiz Application as a kind of questionnaire.
With the Quiz Application, special users you can call administrators will be allowed to create tests, so regular users can answer the questions and test their understanding of the topics in the quiz.
Examples of Quiz Applications
Here are some implementations of the Quiz Application idea:
The main objective of this project is to set quizzes and have people answer them. Therefore, users should be able to set questions, and other users should be able to answer those questions. The application will then display the final score and the right answers.
If you want users to be able to have a record of their scores, you may have to implement an account creation feature.
Users creating the tests should be able to create tests with the questions and answers by simply uploading a text file. The text file will have a format that you can decide, so the application can convert from a file to a quiz.
You’ll need to implement a database for this project. The database will store the questions, possible answers, correct answers, and the scores for each user.
For more of a challenge, you can allow users to add timers to the quizzes. This way, the creators of a quiz can determine how many seconds or minutes a user should spend on each question in the quiz.
It would be great to also have a quiz-sharing feature, so users can share interesting quizzes with their friends on other platforms.
GUI Project Ideas
In this section, you’ll see project ideas for Graphical User Interfaces. These project ideas can be classified as entertainment, finance, and utility tools.
Here’s are the project ideas:
- MP3 Player
- Alarm Tool
- File Manager
- Expense Tracker
Audio is as important as text today if not more important. Since audio files are digital files, you’ll need a tool that can play them. Without a player, you’ll never be able to listen to the contents of an audio file.
This is where the MP3 Player comes in. The MP3 Player is a device for playing MP3s and other digital audio files. This MP3 Player GUI project idea attempts to emulate the physical MP3 Player. You can build software that allows you play an MP3 files on your desktop or laptop computer.
When you are done building the MP3 Player project, users can play their MP3 files and other digital audio files without having to purchase a physical MP3 Player. They’ll be able to play the MP3 files using their computers.
Examples of MP3 Players
Here are some implementations of the MP3 Player idea:
The main objective of this project is to allow users to play MP3 and digital audio files. To be engaging for users, the application has to have a simple but beautiful user interface.
You can have an interface for listing the available MP3 files. You can also give users the option to list other digital audio files that are not MP3.
The users will also expect the MP3 Player to have an interface that shows information on the file that is playing. Some of the information you can include are the name of the file, its length, the amount played, and the amount not played, in minutes and seconds.
Python has libraries that can play audio files, such as
pygame, which allows you to work with multimedia files in few lines of code. You can also check out
These libraries can handle a lot of digital audio files. They can handle other file types, not just the MP3 files.
You can also implement a feature that allows users to create a playlist. To do this, you’ll need a database to store information on the created playlists. Python’s
sqlite3 module allows you to use the SQLite database.
The SQLite database is a better option in this case, because it is file based and easier to set up than other SQL databases. While SQLite is file based, it is better for saving data than a regular file.
For a more exciting challenge, you can add a feature to allow the MP3 player to repeat currently playing files or even shuffle the list of files to be played.
It’s also possible to implement a feature that allows users to increase and decrease the playing speed of the audio file. Users will find this interesting, as they’ll be able to play files at a slower or faster pace than usual.
As they say, “Time and tide wait for no man.” But with a lot of things going on in our lives, it’s difficult to not lose track of time. To be able to keep track of time, a reminder is needed.
This is where the Alarm Tool comes in. An alarm is a device that gives an audio or visual signal about a certain condition. This Alarm Tool project idea is an attempt to build an alarm as software. The Alarm Tool gives an audio signal when a certain condition is met. The set time is the certain condition in this case.
With the Alarm Tool, users can set alarms to remind them of things at certain times of the day. The Alarm Tool project will work from the user’s laptop or desktop device, so they do not have to purchase a physical timer.
Examples of Alarm Tools
Here are some implementations of the Alarm Tool idea:
The main objective of this project is to activate audio signals at certain times of the day. So, timing and the audio signal to be played are the most important parts of the Alarm Tool.
The Alarm Tool should allow users to create, edit, and delete alarms. It should also have an interface that lists all the alarms, provided they have not being deleted by the user. So, it should list the active and inactive alarms.
Since it is an alarm, the application has to play tones at the set time. There are libraries for playing audio, like the
In your code logic, the application has to keep checking for set alarm times. When the time is reached, it triggers a function to play the alarm tone.
Since the application will check for set alarm times, it means the application has to save the alarms in a database. The database should store things like the alarm date, time, and tone location.
As an extra feature, you can allow users to set recurring alarms. They’ll be able to set alarms that will ring at a certain time on certain days of the week, every week. As an example, an alarm can be set at 2:00 PM every Monday.
You can also add a snooze feature, so your users can snooze alarms instead of only dismissing them.
The number of files on the personal computer of an average PC user is pretty high. If all of those files were placed in a single directory, it would be difficult to navigate and find files or directories. So, there is a need to arrange the files and manage them properly.
This is where a file manager comes in. A file manager allows users to manage files and directories through a user interface. While files can be managed through the command-line, not all users know how to do that.
With a file manager, users can arrange, access, and administer their files and directories properly without knowing how to use the command line. Some of the tasks a file manager allows users to perform includes copying, moving, and renaming files or directories.
Examples of File Manager Tools
Here are some implementations of the File Manager idea:
The main objective of the file manager project is to give users an interface to manage their files. Users want a file manager that has a file management tool that looks good and is easy to use.
You can use the
PySimpleGUI library to create unique user interfaces with a powerful widget, without having to deal with a lot of complexity.
Your users should be able to perform simple tasks like creating new directories or empty text files. They should also be able to copy and move files or directories.
shutil libraries will be quite useful for this project, as they can be used to execute actions on the files in the background, while the user clicks away.
The grid and list views are popular views today, so you can implement both in the application. This gives the user the option to choose which view option is suitable for them.
To make the file manager a bit more advanced, you can implement a search feature. So users can search for files and directories without having to find them manually.
You can also implement a sort feature. This will allow users to sort files according to different orders, such as time, alphabetical order, or size.
We have daily expenses, from groceries to clothing to bills. There are so many expenses that it’s normal to lose track of them and keep spending till we’re almost out of cash. A tracker can help people watch their expenses.
This is where the expense tracker comes in. An expense tracker is a software tool that allows users to keep track of their expenses. It can also analyze the expenses, depending on how advanced it is, but let’s keep it simple for now.
With the expense tracker, users can set a budget and track their spending so as to make better financial decisions.
Examples of Expense Trackers
Here are some implementations of the Expense Tracker idea:
The main objective of this project is to keep track of the user’s expenses. Some statistical analysis has to be done to be able to give users correct information on their expenses and help them spend better.
While tracking the expenses is the key thing, a good interface is also important. With
PySimpleGUI, you can create a unique interface to improve the experience of the users.
PyData libraries such as
matplotlib can be helpful for building the expense tracker.
pandas library can be used for the data analysis, and the
matplotlib library can be used for plotting graphs. Graphs will give the users a visual representation of their expenses, and a visual representation is usually easier to understand.
The application will receive data from the users. The data here is the inputted expenses. So, you’ll have to store the expenses in a database. The SQLite database is a good database choice for this project since it can be set up quickly. You can use
sqlite3 module for the SQLite database.
For your users to benefit from this project, they’ll have to input their expenses regularly, which might slip their mind. It could be useful for you to implement a reminder feature. So the application will send a notification at certain times of the day or the week, reminding them to make use of the expense tracker.
Command-Line Project Ideas
In this section, you’ll see project ideas for the command-line. The project ideas discussed can be classified as utility tools.
Here’s are the project ideas:
- Contact Book
- Site Connectivity Checker
- Bulk File Rename Tool
- Directory Tree Generator
We come across lots of people daily. We make acquaintances and friends. We get their contacts to keep in touch later on. Sadly, keeping the received contact details can be hard. One way to do this is to write the contact details down. But this is not secure as the physical book can easily be lost.
This is where the Contact Book project comes in. A contact book is a tool for saving a contact’s details, such as name, address, phone number, and email address. With this contact book project, you can build a software tool that people can use to save and find contact details.
With the contact book project idea, users can save their contacts with less risk of losing the saved contact details. It’ll always be accessible from their computer, through the command-line.
Examples of Contact Book Tools
There are Contact Book applications, but it’s rare to find command-line Contact Book products, as most are web, mobile, or GUI applications.
Note: For an in-depth explanation of how to build a GUI-based contact book, check out Build a Contact Book With Python, PyQt, and SQLite.
Here are some implementations of the Contact Book idea:
The main objective of this project is to save contact details. It’s important that you set up the commands users can use to enter the contact details. You can use the
click command-line frameworks. They abstract a lot of complex stuff, so you only have to focus on the logic to be run when executing commands.
Some features you should implement include the commands to delete contacts, update contact information, and list saved contacts. You can also allow users to list contacts using different parameters, such as alphabetical order or contact creation date.
Since it’s a command-line project, the SQLite database will be fine for saving contacts. SQLite is user-friendly to set up. You may save the contact details in a file, but a file will not offer the benefits you can gain from using SQLite, such as performance and security.
To use the SQLite database in this project, the Python
sqlite3 module will be very useful.
Remember how the database is stored on the user’s computer? What if something happens, like the user losing their files? It means they’ll also lose the contact details.
You can challenge yourself further and backup the database to an online storage platform. To do this, you can upload the database files to the cloud at certain intervals.
You can also add a command that allows users to backup the database themselves. This way, the user can still have access to the contacts if the database file is lost.
You should note that you may need some form of identification, so the contact book can tell which database file belongs to which user. Implementing a user authentication feature is one way to go about it.
Site Connectivity Checker
When you visit a URL, you expect to get the requested pages on your browser. But this is not always the case. Sometimes, sites can be down, so you won’t get the desired results. Instead, you’ll be presented with error messages. You can keep trying a site that is down, till it comes up and you get the information you need.
This is where the Site Connectivity Checker project comes in. The Site Connectivity Checker visits a URL and returns the status of the URL: it is either live or not. The Site Connectivity Checker will visit the URL at intervals, returning the results of each visit.
Instead of manually visiting a URL, a Site Connectivity Checker can do all of that manual work for you. This way, you’ll only get the results of the check without having to spend time on the browser, waiting for the site to go live.
Examples of Site Connectivity Checkers
Here are some implementations of the Site Connectivity Checker idea:
The main objective of this project is to check the status of sites. So, you need to write code for checking the status of a website.
You can choose to use either TCP or ICMP for your connections. The
socket module is one to check out. You can also read Socket Programming in Python (Guide).
Note: Check out Build a Site Connectivity Checker in Python to see a step-by-step example of creating a site connectivity checker.
Through your chosen framework, be it the
argparse framework, you can add commands to allow users to add and remove sites from the list of sites to be checked.
The users should also be able to start the tool, stop it, and determine the intervals.
Since you’ll have to save the list of files to be checked, you can either save it in a file (just a list of sites) or use a SQLite database through the
The application can check for the connectivity status of sites and display the results to the command-line. But this will require the user to keep checking the command-line.
You can increase the challenge and implement a notification feature. The notification feature can be a sound played in the background to alert the user when a site’s status changes. You’ll need a database to store the previous status of a site. That’s the only way the tool can tell when the status changes.
Bulk File Rename Tool
Sometimes, you need to name all the files in a directory according to certain conventions. For example, you can name all the files in a directory with
File0001.jpg, where the numbers increase based on the number of files in the directory. Doing this manually can be stressful and repetitive.
The Bulk File Rename Tool allows users to rename a large number of files, without having to manually rename files.
This saves users a lot of time. It spares them the trouble of having to do boring repetitive work and make mistakes. With the Bulk File Rename Tool, users can rename files in a couple of seconds without any mistakes.
Examples of Bulk File Rename Tools
Here are some implementations of the Bulk File Rename idea:
The main objective of this project idea is to rename files. So, the application needs to find a way to manipulate the target files. The
shutil libraries will be useful for a large part of this project.
Note: For an in-depth explanation of how to build a GUI-based contact book, check out Build a Bulk File Rename Tool With Python and PyQt.
Your users will be able to rename all the files in the directory, using naming conventions. Therefore, they should be able to pass in the naming convention of choice. The
regex module will help match the required naming patterns, if you understand how regex works.
A user may want to pass in a naming convention such as
myfiles as part of the commands and expect that the tool renames all the files like
XYZ is a number. They should also be able to choose the directory where the files to be renamed are.
The major challenge in this project is to rename all the files in a directory. But users may only need to name a certain number of files. To test your skills, you can implement a feature to allow users to choose the number of files to be renamed, instead of all the files.
Note that renaming only a certain number of files will require the tool to sort the files based on alphabetical order, time of file creation, or file size, depending on the user’s requirements.
Directory Tree Generator
Directories are like family trees: each directory has a particular relationship with other directories. No directories ever stays on its own, except an empty root directory.
When you’re working with files and directories, it is difficult to see the relationship between directories, as you can only see what exists in the current directory. You’re either using a file manager or working from the command-line.
With a Directory Tree Generator, you can see the relationship between files and directories like a tree or a map.
This makes it easier to understand the positioning of files and directories. A directory tree map is important when you’re explaining certain concepts, and a Directory Tree Generator makes it easier to get a visual representation of the file and directory relationships.
Examples of Directory Tree Generators
Here are some implementations of the Directory Tree Generator idea:
The main objective of the Directory Tree Generator is to visualize the relationships between files and directories. The
os library can be very useful in listing the files and directories in a chosen directory.
Using a framework such as
argparse helps abstract a lot of stuff, allowing you to focus on writing code for the application’s logic.
Note: Build a Python Directory Tree Generator for the Command Line is a step-by-step tutorial that shows you one way to build a directory tree generator.
In the application’s logic, you can decide how you want to represent files or directories. Using different colors is a brilliant way to go about it. You can use the
colored library to print the files and directories in different colors.
You can also decide how deep you’d like the Directory Tree Generator to go. For example, if a directory has children directories twelve levels deep, you may decide to go only as deep as the fifth level.
If you wish, you can also let the user decide how deep they want the Directory Tree Generator to go.
Since the results of the generated directory tree will be on the command-line, you can go one step further. You can have the generator create images of the directory tree, so it’ll basically turn the text into an image.
You’ll find the
pillow library useful for doing this.
Tips for Working on Projects
Working on projects can be difficult. That’s one reason why motivation and interest in a project will make it a less daunting task.
If you’re interested in a project, you’ll be able to put in the time to research as well as find libraries and tools that will help you with the project.
Here are some tips:
- Find a source of motivation
- Break the project into subtasks
- Do research on the subtasks
- Build each subtasks, one step at a time
- Reach out for help if you’re stuck
- Put the subtasks together
In this article, you’ve seen a couple of Python project ideas you may find interesting.
The project ideas cover a range of platforms. You saw project ideas for the Web, GUI, and Command-line platforms.
You can choose to build a project for different platforms. Using the URL Shortener as an example, you may choose to build one for the Web, GUI, or the Command-line.
Since you’re an intermediate Python developer, these projects can be quite challenging but interesting.
The best way to make a project happen is to just get started. In no time, you’ll be finished and discover how much you’ve benefited from working on a project!
Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Grow Your Python Portfolio With 13 Intermediate Project Ideas