Chapter 4
The reversed() function produces an iterable, but the
argument value must be a sequence object. The function
then yields the items from that object in the reverse order.
We can do a similar kind of thing also with a slice such as tuple(digits(x, b))
[::-1]. The slice, however, is not an iterator. A slice is a materialized object built
from another materialized object. In this case, for such small collections of values,
the distinction is minor. As the reversed() function uses less memory, it might be
advantageous for larger collections.
Using enumerate() to include a sequence number
Python offers the enumerate() function to apply index information to values in a
sequence or iterable. It performs a specialized kind of wrap that can be used as part
of an unwrap(process(wrap(data))) design pattern.
It looks like the following code snippet:
xi
[1.47, 1.5, 1.52, 1.55, 1.57, 1.6, 1.63, 1.65, 1.68, 1.7, 1.73,
1.75, 1.78, 1.8, 1.83]
list(enumerate(xi))
[(0, 1.47), (1, 1.5), (2, 1.52), (3, 1.55), (4, 1.57), (5, 1.6),
(6, 1.63), (7, 1.65), (8, 1.68), (9, 1.7), (10, 1.73), (11, 1.75),
(12, 1.78), (13, 1.8), (14, 1.83)]
The enumerate() function transformed each input item into a pair with a sequence
number and the original item. It's vaguely similar to something as follows:
zip(range(len(source)), source)
An important feature of enumerate() is that the result is an iterable and it works
with any iterable input.
When looking at statistical processing, for example, the enumerate() function comes
in handy to transform a single sequence of values into a more proper time series by
prefixing each sample with a number.