Books by Daniel Zingaro
Learn to Code by Solving Problems
Learn to Code by Solving Problems is a practical introduction to programming using Python. It uses coding-competition challenges to teach you the mechanics of coding and how to think like a savvy programmer.