![](https://csdnimg.cn/release/download_crawler_static/9005731/bg12.jpg)
18 The Python Book
Reductions
In many calculations, one of the
computations you need to do is a reduction
operation. This is where you take some list of values
and reduce it down to a single value. In Python, you
can use the command ‘reduce(function, iterable)’ to
apply the reduction function to each pair of elements
in the list. For example, if you apply the summation
reduction operation to the list of the fi rst fi ve
integers, you would get the result ((((1+2)+3)+4)+5).
You can optionally add a third parameter to act as an
initialisation term. It is loaded before any elements
from the iterable, and is returned as a default if the
iterable is actually empty. You can use a lambda
function as the function parameter to reduce to keep
your code as tight as possible. In this case, remember
that it should only take two input parameters.
Virtualenvs
Because of the potential complexity of
the Python environment, it is sometimes best to
set up a clean environment within which to install
only the modules you need for a given project. In
this case, you can use the virtualenv command
to initialise such an environment. If you create
a directory named ‘ENV’, you can create a new
environment with the command ‘virtualenv
ENV’. This will create the subdirectories bin, lib
and include, and populate them with an initial
environment. You can then start using this new
environment by sourcing the script ‘ENV/bin/
activate’, which will change several environment
variables, such as the PATH. When you are done,
you can source the script ‘ENV/bin/deactivate’
to reset your shell’s environment back to its
previous condition. In this way, you can have
environments that only have the modules you
need for a given set of tasks.
Mapping functions
A common task that is done in modern
programs is to map a given computation
to an entire list of elements. Python provides the
command ‘map()’ to do just this. Map returns a list of
the results of the function applied to each element of
an iterable object. Map can actually take more than
one function and more than one iterable object. If it
is given more than one function, then a list of tuples
is returned, with each element of the tuple containing
the results from each function. If there is more than
one iterable handed in, then map assumes that the
functions take more than one input parameter, so
it will take them from the given iterables. This has
the implicit assumption that the iterables are all of
the same size, and that they are all necessary as
parameters for the given function.
Loops
While not strictly commands, everyone needs
to know how to deal with loops. The two main
types of loops are a fixed number of iterations loop (for) and
a conditional loop (while). In a for loop, you iterate over some
sequence of values, pulling them off the list one at a time
and putting them in a temporary variable. You continue until
either you have processed every element or you have hit a
break command. In a while loop, you continue going through
the loop as long as some test expression evaluates to True.
While loops can also be exited early by using the break
command, you can also skip pieces of code within either
loop by using a continue command to selectively stop this
current iteration and move on to the next one.
“While not strictly commands, everyone needs to
know how to deal with loops. The two main types
of loops are a fixed number of iterations loop (for)
and a conditional loop (while)”
12
Asserting values
At some point, we all need to debug
some piece of code we are trying to write. One
of the tools useful in this is the concept of an
assertion. The assert command takes a Python
expression and checks to see if it is true. If so,
then execution continues as normal. If it is not
true, then an AssertionError is raised. This way,
you can check to make sure that invariants
within your code stay invariant. By doing so,
you can check assumptions made within your
code. You can optionally include a second
parameter to the assert command. This second
parameter is Python expression that is executed
if the assertion fails. Usually, this is some type of
detailed error message that gets printed out. Or,
you may want to include cleanup code that tries
to recover from the failed assertion.
07
Filtering
Where the command map returns a result for every element in an iterable, fi lter only returns a
result if the function returns a True value. This means that you can create a new list of elements where
only the elements that satisfy some condition are used. As an example, if your function checked that
the values were numbers between 0 and 10, then it would create a new list with no negative numbers
and no numbers above 10. This could be accomplished with a for loop, but this method is much
cleaner. If the function provided to fi lter is ‘None’, then it is assumed to be the identity function. This
means that only those elements that evaluate to True are returned as part of the new list. There are
iterable versions of fi lter available in the itertools module.
11
09
08
10