Commit df82b92f authored by Raymond Hettinger's avatar Raymond Hettinger

* Fix typos.

* Format an example so that the identation is more obvious.
* Add a section on the decimal module to the Brief Tour Part II.
parent 6151afe2
...@@ -4338,7 +4338,7 @@ which returns an object with a \method{next()} method. If the class defines ...@@ -4338,7 +4338,7 @@ which returns an object with a \method{next()} method. If the class defines
\method{next()}, then \method{__iter__()} can just return \code{self}: \method{next()}, then \method{__iter__()} can just return \code{self}:
\begin{verbatim} \begin{verbatim}
>>> class Reverse: class Reverse:
"Iterator for looping over a sequence backwards" "Iterator for looping over a sequence backwards"
def __init__(self, data): def __init__(self, data):
self.data = data self.data = data
...@@ -4352,8 +4352,8 @@ which returns an object with a \method{next()} method. If the class defines ...@@ -4352,8 +4352,8 @@ which returns an object with a \method{next()} method. If the class defines
return self.data[self.index] return self.data[self.index]
>>> for char in Reverse('spam'): >>> for char in Reverse('spam'):
print char ... print char
...
m m
a a
p p
...@@ -4371,13 +4371,13 @@ which statement was last executed). An example shows that generators can ...@@ -4371,13 +4371,13 @@ which statement was last executed). An example shows that generators can
be trivially easy to create: be trivially easy to create:
\begin{verbatim} \begin{verbatim}
>>> def reverse(data): def reverse(data):
for index in range(len(data)-1, -1, -1): for index in range(len(data)-1, -1, -1):
yield data[index] yield data[index]
>>> for char in reverse('golf'): >>> for char in reverse('golf'):
print char ... print char
...
f f
l l
o o
...@@ -4894,7 +4894,7 @@ tasks in background while the main program continues to run: ...@@ -4894,7 +4894,7 @@ tasks in background while the main program continues to run:
print 'The main program continues to run' print 'The main program continues to run'
\end{verbatim} \end{verbatim}
The principal challenge of multi-thread applications is coordinating The principal challenge of multi-threaded applications is coordinating
threads that share data or other resources. To that end, the threading threads that share data or other resources. To that end, the threading
module provides a number of synchronization primitives including locks, module provides a number of synchronization primitives including locks,
events, condition variables, and semaphores. events, condition variables, and semaphores.
...@@ -4935,7 +4935,7 @@ This produces the following output: ...@@ -4935,7 +4935,7 @@ This produces the following output:
By default, informational and debugging messages are suppressed and the By default, informational and debugging messages are suppressed and the
output is sent to standard error. Other output options include routing output is sent to standard error. Other output options include routing
messages through email, datagrams, sockets, or to an HTTP Server. New messages through email, datagrams, sockets, or to an HTTP Server. New
filters select different routing based on message priority: DEBUG, filters can select different routing based on message priority: DEBUG,
INFO, WARNING, ERROR, and CRITICAL. INFO, WARNING, ERROR, and CRITICAL.
The logging system can be configured directly from Python or can be The logging system can be configured directly from Python or can be
...@@ -5056,6 +5056,62 @@ want to run a full list sort: ...@@ -5056,6 +5056,62 @@ want to run a full list sort:
\end{verbatim} \end{verbatim}
\section{Tools for Working with Decimal Floating Point\label{decimal-fp}}
The \module{decimal} module, offers a \class{Decimal} data type for
decimal floating point arithmetic. Compared to the built-in \class{float}
type implemented with binary floating point, the new class is especially
useful for financial applications and other uses which require exact
decimal representation, control over precision, control over rounding
to meet legal or regulatory requirements, tracking of significant
decimal places, or for applications where the user expects the results
to match hand calculations done as taught in school.
For example, calculating a 5% tax on a 70 cent phone charge gives
different results in decimal floating point and binary floating point
with the difference being significant when rounding to the nearest
cent:
\begin{verbatim}
>>> from decimal import *
>>> Decimal('0.70') * Decimal('1.05')
Decimal("0.7350")
>>> .70 * 1.05
0.73499999999999999
\end{verbatim}
Note that the \class{Decimal} result keeps a trailing zero, automatically
inferring four place significance from two digit mulitiplicands. Decimal
reproduces mathematics as done by hand and avoids issues that can arise
when binary floating point cannot exactly represent decimal quantities.
Exact representation enables the \class{Decimal} class to perform
modulo calculations and equality tests that are unsuitable for binary
floating point:
\begin{verbatim}
>>> Decimal('1.00') % Decimal('.10')
Decimal("0.00")
>>> 1.00 % 0.10
0.09999999999999995
>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
True
>>> sum([0.1]*10) == 1.0
False
\end{verbatim}
The \module{decimal} module also allows arbitrarily large precisions to be
set for calculation:
\begin{verbatim}
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal("0.142857142857142857142857142857142857")
\end{verbatim}
\chapter{What Now? \label{whatNow}} \chapter{What Now? \label{whatNow}}
Reading this tutorial has probably reinforced your interest in using Reading this tutorial has probably reinforced your interest in using
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment