From b0bd32876d9fa82701c50f1df75088e9c95f381f Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 4 Feb 2026 14:21:20 -0600 Subject: [PATCH] [3.13] Itertools recipes: Replace the tabulate() example with running_mean() (gh-144483) (cherry picked from commit b6d8aa436b0108fcc90cb13f9be864cfd4ea2ca7) Co-authored-by: Raymond Hettinger --- Doc/library/itertools.rst | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 51bbca2cf0f2d4..8c352c939e9e54 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -842,7 +842,7 @@ and :term:`generators ` which incur interpreter overhead. from contextlib import suppress from functools import reduce from math import comb, prod, sumprod, isqrt - from operator import itemgetter, getitem, mul, neg + from operator import itemgetter, getitem, mul, neg, truediv def take(n, iterable): "Return first n items of the iterable as a list." @@ -853,9 +853,10 @@ and :term:`generators ` which incur interpreter overhead. # prepend(1, [2, 3, 4]) → 1 2 3 4 return chain([value], iterable) - def tabulate(function, start=0): - "Return function(0), function(1), ..." - return map(function, count(start)) + def running_mean(iterable): + "Yield the average of all values seen so far." + # running_mean([8.5, 9.5, 7.5, 6.5]) -> 8.5 9.0 8.5 8.0 + return map(truediv, accumulate(iterable), count(1)) def repeatfunc(function, times=None, *args): "Repeat calls to a function with specified arguments." @@ -1210,8 +1211,8 @@ The following recipes have a more mathematical flavor: [(0, 'a'), (1, 'b'), (2, 'c')] - >>> list(islice(tabulate(lambda x: 2*x), 4)) - [0, 2, 4, 6] + >>> list(running_mean([8.5, 9.5, 7.5, 6.5])) + [8.5, 9.0, 8.5, 8.0] >>> for _ in loops(5): @@ -1748,6 +1749,10 @@ The following recipes have a more mathematical flavor: # Old recipes and their tests which are guaranteed to continue to work. + def tabulate(function, start=0): + "Return function(0), function(1), ..." + return map(function, count(start)) + def old_sumprod_recipe(vec1, vec2): "Compute a sum of products." return sum(starmap(operator.mul, zip(vec1, vec2, strict=True))) @@ -1827,6 +1832,10 @@ The following recipes have a more mathematical flavor: .. doctest:: :hide: + >>> list(islice(tabulate(lambda x: 2*x), 4)) + [0, 2, 4, 6] + + >>> dotproduct([1,2,3], [4,5,6]) 32