The title is a bit misleading – this is not a book for learning to program in Python, it is on overview of the sorts of subjects university computer science courses will cover. It does teach some things about Python programming as part of showing how problems can be solved, but it is hardly complete in that area; for example list comprehensions are never mentioned, dictionaries appear only in passing in the last chapters of the book.
As might be expected given the authors, there is a heavy emphasis on algorithms and the use of recursion in particular. It is assumed the reader is a science or engineering student, the vast majority of the exercises deal with mathematical concepts that occur in such an environment. However it is not a text on design and analysis of algorithms, it does not delve deeply into the mathematics behind analysing time and memory usage.
The book does put a heavy emphasis on good programming practices – tasks should be broken down into functions which have single purpose, programmers should pay attention to and measure how programs perform as a function of input size, advice on how to choose an API when building modules as part of a larger program, etc. There are a huge number of interesting challenges in the exercises for each chapter which can keep the reader busy for quite some time.
In summary, this is not a book you will keep as a reference on your bookshelf, you won’t be going back to it over and over again. From a learning Python perspective, this is not what you will want. From a comp-sci perspective, I found too much of the treatment to be insufficient in depth. It’s a good overview of what there is to learn in the field, but doesn’t treat any of the topics sufficiently on its own.