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!!!!