Intermediate Python Programming 2nd Edition by Matt Harrison