Unit 8 • Lesson 3

Using Print Statements for Debugging

Overview

One of the simplest ways to debug is by printing variable values and flow checkpoints. You'll learn how to strategically place print statements to understand what your program is doing at every step, gaining insight into program behavior.

Beginner 15–20 min

What You Will Learn in This Lesson

By the end of this lesson, you will know:

  • Using print() for debugging: How to add print statements to understand code flow.
  • Strategic placement: Where to put print statements for maximum insight.
  • What to print: Variables, function calls, and flow checkpoints.
  • Debugging techniques: Using print statements effectively.
  • Best practices: When to use print debugging vs other tools.

Why Print Statements?

The simplest debugging tool is already built into Python: the print() function. Adding print statements lets you see what's happening inside your code as it runs.

Why Print Debugging Works

  • No special tools needed - print() is always available
  • Quick to add and remove
  • Shows exact values at specific points
  • Helps trace program flow
  • Works everywhere Python runs
Basic Print Debugging
def calculate_total(price, quantity):
    print(f"DEBUG: price = {price}, quantity = {quantity}")
    total = price * quantity
    print(f"DEBUG: total = {total}")
    return total

result = calculate_total(10, 5)
print(f"DEBUG: result = {result}")

What to Print

Knowing what to print is key to effective debugging:

Variable Values

See what values variables have at different points

Function Entry/Exit

Confirm functions are being called and when they return

Loop Iterations

See which iterations execute and what values change

Conditional Branches

Verify which if/else branches execute

Calculations

Check intermediate calculation results

Data Structures

Inspect lists, dictionaries, and other data

Strategic Print Placement

Place print statements strategically to trace program flow:

Example: Tracing Function Flow
def find_max(numbers):
    print(f"DEBUG: Function called with {numbers}")
    
    if not numbers:
        print("DEBUG: Empty list, returning None")
        return None
    
    max_value = numbers[0]
    print(f"DEBUG: Starting with max_value = {max_value}")
    
    for num in numbers:
        print(f"DEBUG: Checking {num} against {max_value}")
        if num > max_value:
            max_value = num
            print(f"DEBUG: New max_value = {max_value}")
    
    print(f"DEBUG: Returning {max_value}")
    return max_value

Pro Tip: Use Prefixes

Prefix debug prints with "DEBUG:" or ">>>" so you can easily find and remove them later. Some developers use print(">>>", variable) for quick identification.

Summary

In this lesson, you learned:

  • Print debugging: Simple but effective debugging technique
  • What to print: Variables, function calls, loops, conditionals
  • Strategic placement: Put prints at key points in your code
  • Best practices: Use prefixes, remove when done

Remember

Print debugging is great for quick debugging, but for complex programs, consider using a debugger (covered in the next lesson). However, print statements are always useful and often the fastest way to understand what's happening!

End-of-Lesson Exercises

Think about these questions to reinforce what you've learned:

Exercise 1: Print Debugging

How can print statements help you debug code? What should you print to understand program flow?

Exercise 2: Strategic Placement

Where would you place print statements to debug a function that's not working correctly?