Print statements are important, very very important. 

Of all the things I have learned over the years of scripting python, nothing is more handy than a print statement.

The reason for this is that trial and error is only efficient if the error is effectively understood. And with python the way to understand errors is to print them.

When your code begins to gain complexity with infinite nests and loops, it starts to become difficult to find where your program fails, when it fails. You may get a generic error statement, which is fine, but that doesn't tell you the specifics you need to drill down to the problem. Therefore, when debugging, you can throw in a bunch of print statements at every indent, within every nest, to see how far your program gets until it fails. Lets look at an example. There are two if statements nested within the first:

	if something:
		do something
		if another something:
			do something
			if another another something:
				do something


Now let's say you get some generic error. Maybe the logic isn't playing out how you need it to. The error will give you the line number is suspects the logic failed at.
But, this line could be the start of a function or a loop, yet the actual defect is somewhere nested deep within that function or loop. So, to debug this correctly:

	if something:
		print("level 1")
		do something
		if another something:
			print("level 2")
			do something
			if another another something:		
				print("level 3")
				do something

In this way, at each stage of the IF nest, you are printing something. If the printing stops at the second layer, you know something went wrong there. This wll become very
useful in your python journey.
