Every programmer sees errors all day; reading them is a skill. When Python can't go on, it prints a traceback. Read it from the bottom: the last line names the kind of error and what went wrong, and the lines above say which line of your code it happened on.
Traceback (most recent call last):
File "shop.py", line 3, in <module>
print(totl)
NameError: name 'totl' is not defined
A few errors cover most cases. SyntaxError: the code isn't valid Python, like a missing colon or bracket. IndentationError: the spacing of a block is off. NameError: a name that doesn't exist yet, often a typo. TypeError: the wrong type, like adding text to a number. IndexError: a list position that isn't there. KeyError: a dictionary key that isn't there. ZeroDivisionError: dividing by zero.
Some bugs don't crash at all; the program just gives the wrong answer. The classic is the off-by-one error: a loop that runs one time too many or too few, like range(1, 10) when you wanted 1 to 10.
To find a bug, make it happen reliably, then narrow it down. Add print() lines to see what the variables really hold at each step, and compare with what you expected. The first place they differ is where the bug is.
Practice
Which error does this give?
print("Total: " + 12)
More info
Quick reference
SyntaxError
Not valid Python: a missing colon, bracket or quote.