Class Notes: Debugging


In class, we'll have a short discussion on some helpful debugging techniques, especially using print statements strategically.
The Problem: We Have a Bug!
Here is an example with a bug intentionally added:
# THIS CODE HAS A BUG (ON PURPOSE)!!!!

# When you run it, it will hang (run forever)!!!!

def isPrime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    maxFactor = round(n**0.5)
    for factor in range(3,maxFactor+1,2):
        if n % factor == 0:
            return False
    return True

def nthPrime(n):
    found = 0
    guess = 0
    while found <= n:
        guess += 1
        if isPrime(guess):
            found + 1
    return guess

print('The next line will hang (run forever):')
print(nthPrime(5))

A Helpful Approach: Print Statement Debugging
Now, let's add a well-placed print statement to shine a light on what the bug is:
# THIS CODE STILL HAS A BUG (ON PURPOSE)!!!!

# When you run it, it will hang (run forever)!!!!

def isPrime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    maxFactor = round(n**0.5)
    for factor in range(3,maxFactor+1,2):
        if n % factor == 0:
            return False
    return True

def nthPrime(n):
    found = 0
    guess = 0
    while found <= n:
        print(guess, found) ### <--- THIS is our well-placed print statement!
        guess += 1
        if isPrime(guess):
            found + 1
    return guess

print('The next line will hang (run forever):')
print(nthPrime(5))

Even Better: Print Statement Debugging with locals() + input()
Check out this perhaps even-more-helpful approach:
# THIS CODE STILL HAS A BUG (ON PURPOSE)!!!!

# When you run it, it will hang (run forever)!!!!

def isPrime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    maxFactor = round(n**0.5)
    for factor in range(3,maxFactor+1,2):
        if n % factor == 0:
            return False
    return True

def nthPrime(n):
    found = 0
    guess = 0
    while found <= n:
        print(locals()) ### <--- THIS is our well-placed print statement!
        input()         ### <--- THIS pauses until we hit Enter. Sweet!
        guess += 1
        if isPrime(guess):
            found + 1
    return guess

print('The next line will hang (run forever):')
print(nthPrime(5))

Now that was super helpful!!!!