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)

Variable scope

When you work with variables inside functions, it’s important to understand scope – the area of the program where a variable is visible/accessible. In Python, variables defined inside a function have local scope, while variables defined outside any function have global scope.

Local Variables: A variable assigned inside a function is local to that function. It exists only during that function’s execution and is not accessible outside of it. Each time you call the function, a new set of local variables is created for that call. For example:

def greet():
    msg = "Hello from inside the function!"
    print(msg)

greet()                      
print(msg)   # This will cause a NameError

In the above code, msg is defined inside greet(). Printing msg inside the function works and will output "Hello from inside the function!". But when we try to print msg outside the function, we get a NameError: name 'msg' is not defined, because msg was a local variable and went away after greet() finished executing. Local variables cannot be directly accessed from outside their function.

Global Variables: A variable defined in the main body of the code (i.e., not in any function) is a global variable. Global variables have a scope that spans the entire file (and even beyond, if imported elsewhere): they can be read from inside functions, and from any code in the module/file. For example:

message = "Python is awesome!"   # global variable

def display():
    print("Inside function:", message)

display()                           # prints "Inside function: Python is awesome!"
print("Outside function:", message) # prints "Outside function: Python is awesome!"

Here, message is declared outside the function, so display() can access and print it, and it’s also accessible after the function call in the global context. Simply reading a global variable inside a function is fine. However, assigning to a variable inside a function will, by default, create a new local variable rather than affecting a global variable of the same name.

Local vs. Global with Same Name: If you have a global variable and a local variable with the same name, the local variable shadows the global one inside the function. The function will see only its local version, and the global variable remains unchanged. For instance:

x = 100  # global x
def f():
    x = 42  # local x (shadows global x)
    print("inside f, x =", x)

f()           
print("global x =", x)

This will output inside f, x = 42 and then global x = 100. Inside f(), when we do x = 42, Python creates a new local variable x (this does not affect the global x). Thus, printing x inside gives 42, but outside, x is still 100.

Modifying Global Variables from Inside a Function: By default, you cannot assign to a global variable inside a function without explicitly telling Python that it’s global. If you try, Python will treat the assignment as creating a new local variable, which often isn’t what you intended and can lead to an error if you simultaneously try to read the global variable. Consider:

count = 10        # a global variable
def increment():
    count = count + 1   # attempt to modify global count (ERROR!)
    print("Inside function, count =", count)

increment()

This results in an UnboundLocalError complaining that the local variable count is referenced before assignment. The moment we assign count = count + 1 inside the function, Python assumes count is a new local variable in increment. It has no initial value (and we’re trying to use its current value on the right side of =, hence the error).

The global keyword: To modify a global variable inside a function, you must declare it as global in that function. Using the global keyword tells Python “don’t create a new local variable, use the existing global variable of this name.” For example:

total = 0   # global variable
def add_to_total(amount):
    global total        # declare that we mean the global 'total'
    total = total + amount  # now this will modify the global variable
    print("Inside function, total =", total)

add_to_total(5)    # Inside function, total = 5
print("Outside, total =", total)  # Outside, total = 5

In this code, by declaring global total inside the function, the assignment total = total + amount updates the global variable total rather than creating a local one. After calling add_to_total(5), the global total has changed from 0 to 5. Use global carefully – it makes your function depend on external state. In many cases, it’s better practice to return values from functions and assign them to globals outside, rather than modifying globals directly.

Nonlocal variables: Python also has a nonlocal keyword for nested functions (when a function is defined inside another function) to modify variables in the outer (enclosing) function’s scope. This is a more advanced topic not needed for basic function use, but just be aware it exists for completeness.

Summary of Scope: By default, assignments inside a function create local variables. You can access global variables inside a function for reading, but to assign to a global variable from within a function, declare it with global. Local and global variables of the same name are different variables. Understanding scope helps prevent bugs – for example, accidentally using a global variable when you intended to use a local one (or vice versa). It’s often best to minimize reliance on global variables and instead pass needed values into functions and return results, which makes the functions easier to reuse and test.