Course Content
Module 1 – Getting Started with Python
introduced the fundamentals of Python, giving beginners a clear understanding of how the language works and how to start writing simple programs. Python was highlighted as a beginner-friendly language with simple syntax, making it easy to read and write code.
0/7
Module 2 – Introduction to Python Programming
In this Introduction to Python module, learners explore Python’s clear, readable syntax and powerful features. Beginning with installation and a simple “Hello, World!” script, you will progress through variables, control flow and functions using step-by-step examples. By the end, you will be equipped to write your own Python programmes, automate routine tasks and tap into an extensive library ecosystem for real-world projects.
0/7
Basic Command for Command prompt, PowerShell, Zsh(macOS)
0/1
Module 3 – Variables, Data Types and Basic Operations
In the Variables, Data Types and Basic Operations in Python module, learners explore how to store and manage data using variables, master fundamental types such as integers, floats, strings and booleans, and perform arithmetic, comparison and logical operations step by step. Clear explanations, real world examples and hands on exercises guide you through writing and debugging code. By the end of this module, you will be ready to build dynamic Python programs and automate everyday tasks.
0/6
Module 4 – Control Flow – Conditions and Loops
Control flow structures determine the order in which your program’s code executes. With conditional statements, you can make decisions and execute certain code blocks only when specific conditions are met. Loops allow you to repeat actions efficiently without writing redundant code. In this module, we will explore fundamental control flow concepts in Python in a step-by-step manner, similar to Microsoft’s learning curriculum. By the end, you’ll understand how to use if, elif, and else statements (including nested conditions) for decision-making, how truthy and falsy values work in Boolean logic, how to construct for loops (using range() and iterating over collections), how to use while loops along with loop control statements (break and continue), and how to leverage list comprehensions and generator expressions for concise looping. Finally, we’ll apply these concepts in a practical exercise to build an interactive decision-making system. Each section below includes explanations, code examples, and mini-exercises to reinforce the concepts, all formatted for clarity and easy follow-along.
0/8
Day 1 Summary
We covered Modules 1, 2 & Module 3 (Lesson 1 & 2)
0/1
Module 5 – Functions and Code Organisation
Imagine you need to clean up a messy data set or send a personalised email to each customer. Instead of writing the same steps over and over, you can create a function and call it whenever you need. In this lesson on Functions and Code Organisation, you will learn how to define functions, pass and return information, document your work and group related code into modules for easy reuse and maintenance.
0/10
Day 2 Summary
Summary for Day 21 Aug 2025
0/1
Day 3 Summary
Summary of Day 28 Aug 2025
0/1
Module 7 – Working with Files and Folders
In this lesson, we will learn how to manipulate files and directories using Python. We’ll explore common file operations using the os module, and see how the pathlib module provides an object-oriented way to handle file paths. We’ll also use the glob module for pattern-based file searches and learn file I/O operations for text, CSV, and binary files. Additionally, we’ll introduce the calendar and time modules to work with dates and timestamps. Finally, an interactive lab will tie everything together by automating a folder backup and cleanup task. Follow the step-by-step sections below for each subtopic, try out the code examples, and explore the guided lab at the end.
0/9
Module 8 – Error Handling and Debugging Techniques
In this lesson, we will learn how to handle errors in Python programs and how to debug code effectively. Errors are inevitable, but knowing how to manage them ensures our programs don't crash unexpectedly. We will cover the difference between syntax errors and exceptions, how to use try, except, else, and finally blocks to catch and handle exceptions, and how to raise your own exceptions (including creating custom exception classes). We’ll also explore debugging strategies: using simple print statements or the logging module to trace your program’s execution, and using Python’s interactive debugger pdb to step through code. By following best practices for error handling and debugging, you can write resilient, maintainable code. Throughout this lesson, try the examples and exercises to practice these techniques.
0/9
Day 4 Summary
0/1
Module 9 – Automating Excel and PDFs with Python
In this lesson, you will learn how to automate common communication and reporting tasks using Python. We will cover sending notifications via email, messaging platforms, and SMS, as well as manipulating Excel spreadsheets and PDF files programmatically. Each section below includes step-by-step explanations, code examples, and interactive exercises to reinforce your understanding. By the end of this lesson, you’ll be able to send emails with attachments, integrate with Slack/Microsoft Teams, send SMS alerts, and automate Excel/PDF workflows.
0/9
Day 5 Summary
0/1
Mini Project: Build your own Automation Tool
The project incorporates two common automation tasks – Contact Management and Student Tasks Tracking
0/2
Day 6 Summary
0/1
Introduction to Python Programming (Copy 1)

Exception Handling

Python provides the try ... except construct to handle exceptions that may occur in a block of code. The basic idea is: you “try” to execute some code, and if a specific exception happens, you “catch” it in an except block and handle it gracefully instead of crashing. Optional else and finally clauses provide additional control flow for when no exceptions occur, or for cleanup actions that should run regardless of an exception.

Syntax of try/except:

try:
    # Code that might raise an exception
except SomeException:
    # Handle the exception of type SomeException

You can also have multiple except blocks to handle different exception types, and a generic catch-all. Here’s a more complete pattern including else and finally:

try:
    # 1. Code that could raise an exception
except ValueError:
    # 2. This block runs if a ValueError was raised in try
except Exception as e:
    # 3. This runs for any other exception not caught above
    # (using Exception catches most errors)
else:
    # 4. This runs if no exception occurred at all in try
finally:
    # 5. This runs at the end, whether or not an exception happened

Let’s break down the behavior:

  • try block: Python executes the code inside try first. If no error occurs, it skips all except blocks.

  • except blocks: If an exception is raised inside the try block, Python looks for an except block with a matching exception type. If it finds a match, it executes that block and then continues after the try/except structure. If no matching except is found, the exception propagates upward (and if uncaught, you’ll get a traceback). You can have multiple except clauses to handle different exceptions separately. For example, one except for ValueError and another forZeroDivisionError, etc. Only the first matching except will run.

  • else block: This is optional. The else clause runs only if the try block did not raise any exception. This is useful for code that should execute when the try succeeds, and you want to keep that code outside of the try to avoid accidentally catching exceptions it might raise. For instance, you might open a file in thetry, handle an IOError in except, and put code that processes the file in the else so it only runs if the file was opened successfully.

  • Finally block: This clause runs no matter what. Whether the try block finishes normally, or an exception was raised (even if it was caught, or even if it wasn’t caught), the code in finally will execute after. This is typically used for cleanup actions – for example, closing a file or releasing a resource, to ensure it always happens. Even if you return or break inside try or except, the finally will still execute just before that action completes.

Example with else and finally:

def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Cannot divide by zero!")            # Handle division by zero
        result = None
    else:
        print("Division successful! result =", result)  # Runs only if no exception
    finally:
        print("Execution of divide() is done.")    # Runs regardless of what happened
    return result

divide(10, 2)
print("---")
divide(5, 0)

Running this example would produce output like:

Division successful! result = 5.0  
Execution of divide() is done.  
---  
Cannot divide by zero!  
Execution of divide() is done.

Notice how:

  • When b was 2 (no exception), the except was skipped, the else ran confirming success, and finally ran last.

  • When b was 0 (causing a ZeroDivisionError), the except ZeroDivisionError ran, the else was skipped (since an exception occurred), and then finally ran. In both cases, finally executed at the end.

Why use an else?
It helps keep the successful path separate from the error handling. If you put everything in the try, you might catch an exception from code that you didn’t intend to. The Python docs recommend using else for code that should run only when no exceptions happened. In our example, printing the success message in else ensures it doesn’t run when an exception occurs.

Important: The finally is executed regardless of whether an exception was handled or not. Even if you don’t catch an exception (or if you use sys.exit() or a return inside try), the finally block will still execute before the program fully unwinds. This guarantee is why finally is used for cleanup (closing files, releasing locks, etc.) so resources are not left hanging.