> On Apr 6, 2018, at 9:06 PM, Tim Peters <tim.pet...@gmail.com> wrote: > >> >> What is this code trying to accomplish? > > It's quite obviously trying to bias the reader against the proposal by > presenting a senseless example ;-)
FWIW, the example was not from me. It was provided by the OP on the tracker. I changed the start point from 10 to a 6 so it at least made some sense as the continuation of a factorial sequence: 6 24 120 > By sheer coincidence, I happened to write another yesterday. This is > from a program looking for the smallest integers that yield new > records for Collatz sequence lengths. Nice. That brings the number of real-world examples up to a total of three (collatz, wheel sieve, and signal processing). Prior to today, that total was only one (which was found after much digging). > Later: > > def coll(SHIFT=24): > ... > from itertools import accumulate, chain, cycle > ... > LIMIT = 1 << SHIFT > ... > abc, first, deltas = buildtab(SHIFT, LIMIT) > ... > for num in accumulate(chain([first], cycle(deltas))): > assert num % 3 != 2 > > As in Will's code, it would be more readable as: > > for num in accumulate(cycle(deltas), start=first): That does read better. I am curious how you would have written it as a plain for-loop before accumulate() was added (part of the argument against reduce() was that a plain for-loop would be clearer 99% of the time). > That said, if the need came up often, as you noted it's dead easy to > write a helper function to encapsulate the "head scratcher" part, and > with no significant loss of efficiency. > > So I'd be -0 overall, _except_ that "chain together a singleton list > and a cycle" is so obscure on the face of it than I'm not sure most > programmers who wanted the functionality of `start=` would ever think > of it. I'm not sure that I would have, except that I studied Ness's > wheel sieve code a long time ago and the idea stuck. So that makes me > +0.4. Agreed that the "chain([x], it)" step is obscure. That's a bit of a bummer -- one of the goals for the itertools module was to be a generic toolkit for chopping-up, modifying, and splicing iterator streams (sort of a CRISPR for iterators). The docs probably need another recipe to show this pattern: def prepend(value, iterator): "prepend(1, [2, 3, 4]) -> 1 2 3 4" return chain([value], iterator) Thanks for taking a look at the proposal. I was -0 when it came up once before. Once I saw a use case pop-up on this list, I thought it might be worth discussing again. Raymond _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/