[Python-ideas] Pass a function as the argument "step" of range()
Terry Reedy
tjreedy at udel.edu
Fri Jul 3 23:24:57 CEST 2015
On 7/3/2015 7:23 AM, Nick Coghlan wrote:
> On 3 July 2015 at 06:20, Pierre Quentel <pierre.quentel at gmail.com> wrote:
>> @Steven, Mark
>> The definition of range() in Python docs says :
>>
>> Python 2.7 : "This is a versatile function to create lists containing
>> arithmetic progressions. It is most often used in for loops."
>>
>> Python 3.4 : "The range type represents an immutable sequence of numbers and
>> is commonly used for looping a specific number of times in for loops."
>
> Pierre, I *wrote* the Python 3 range docs.
I think deleting 'arithmetic' was a mistake. Would you mind changing
'immutable sequence' to 'immutable arithmetic sequence'?
Also, I think 'numbers' should be narrowed to 'integers' (or whatever is
actually accepted). The idea of allowing floats has been proposed at
least once, probably more, and rejected.
...
> There isn't a "general idea" behind Python 3's range type, there's a
> precise, formal definition.
'predictable finite increasing or decreasing arithmetic sequence of
integers, efficiently implemented'
Making step an arbitrary function removes all the adjectives except
(maybe) 'of integers', leaving 'sequence of integers'. There are
several ways to generate unrestricted or lightly restricted sequences.
> For starters, the contents are defined to meet a specific formula:
> ===================
> For a positive step, the contents of a range r are determined by the
> formula r[i] = start + step*i where i >= 0 and r[i] < stop.
>
> For a negative step, the contents of the range are still determined by
> the formula r[i] = start + step*i, but the constraints are i >= 0 and
> r[i] > stop.
For a 0 step, which properly is neither + nor -, a ValueError is raised.
range() looks at the value of step to decide whether to raise or return.
Something must look as the sign of step to decide whether stop is a max
or min, and what comparison to use. Since the sign is constant, this
determination need only be done once, though I do not know where or when
it is currently done.
Given that a function has neither a value nor sign, and each call can
have not only a different value, but a different sign. A step function
is a very messy fit to an api with a stop parameter whose meaning
depends on the sign of step. For many sequences, one would want an
explicit max or min or both.
Range could have had number-of-items parameter instead of the max-or-min
stop parameter. Indeed, this would be easier in some situations, and
some languages slice with start and number rather than start and stop.
But range is intentionally consistent with python slicing, which uses
start, a max-or-min stop, and a + or - step.
--
Terry Jan Reedy
More information about the Python-ideas
mailing list