#### Overview of this book

Learning Python has a dynamic and varied nature. It reads easily and lays a good foundation for those who are interested in digging deeper. It has a practical and example-oriented approach through which both the introductory and the advanced topics are explained. Starting with the fundamentals of programming and Python, it ends by exploring very different topics, like GUIs, web apps and data science. The book takes you all the way to creating a fully fledged application. The book begins by exploring the essentials of programming, data structures and teaches you how to manipulate them. It then moves on to controlling the flow of a program and writing reusable and error proof code. You will then explore different programming paradigms that will allow you to find the best approach to any situation, and also learn how to perform performance optimization as well as effective debugging. Throughout, the book steers you through the various types of applications, and it concludes with a complete mini website built upon all the concepts that you learned.
Learning Python
Credits
Acknowledgements
www.PacktPub.com
Preface
Free Chapter
Introduction and First Steps – Take a Deep Breath
Built-in Data Types
Iterating and Making Decisions
Functions, the Building Blocks of Code
Saving Time and Memory
Advanced Concepts – OOP, Decorators, and Iterators
Testing, Profiling, and Dealing with Exceptions
The Edges – GUIs and Scripts
Data Science
Web Development Done Right
Debugging and Troubleshooting
Summing Up – A Complete Example
Index

## One final example

Before we finish off this chapter, how about a final example? I was thinking we could write a function to generate a list of prime numbers up to a limit. We've already seen the code for this so let's make it a function and, to keep it interesting, let's optimize it a bit.

It turns out that you don't need to divide it by all numbers from 2 to N-1 to decide if a number N is prime. You can stop at . Moreover, you don't need to test the division for all numbers from 2 to , you can just use the primes in that range. I'll leave it to you to figure out why this works, if you're interested. Let's see how the code changes:

`primes.py`

```from math import sqrt, ceil

def get_primes(n):
"""Calculate a list of primes up to n (included). """
primelist = []
for candidate in range(2, n + 1):
is_prime = True
root = int(ceil(sqrt(candidate)))  # division limit
for prime in primelist:  # we try only the primes
if prime > root:  # no need to check...```