Learn to Code by Solving Problems: A Python Programming Primer
Daniel Zingaro
Algorithmic Thinking: A Problem-Based Introduction