Thinking in Python by Bruce Eckel