8.3 Cloning iterators with tee()
The tee() function gives us a way to circumvent one of the important Python rules for working with iterables. The rule is so important, we’ll repeat it here:
Iterators can be used only once.
The tee() function allows us to clone an iterator. This seems to free us from having to materialize a sequence so that we can make multiple passes over the data. Because tee() can use a lot of memory, it is sometimes better to materialize a list and process it multiple times, rather than trying to use the potential simplification of the tee() function.
For example, a simple average for an immense dataset could be written in the following way:
from collections.abc import Iterable 
 
def mean_t(source: Iterable[float]) -> float: 
    it_0, it_1 = tee(iter(source), 2) 
    N = sum(1 for x in it_0) 
    sum_x = sum(x for x in it_1) 
    return sum_x... 
                                             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
     
         
                 
                 
                 
                 
                 
                 
                 
                 
                