[Python-ideas] Float range class
Andrew Barnert
abarnert at yahoo.com
Thu Jan 8 22:30:15 CET 2015
On Jan 8, 2015, at 10:40, Nathaniel Smith <njs at pobox.com> wrote:
> On Thu, Jan 8, 2015 at 5:58 PM, Todd <toddrjen at gmail.com> wrote:
>> On Thu, Jan 8, 2015 at 6:41 PM, Andrew Barnert <abarnert at yahoo.com> wrote:
>>>
>>> More generally: if an frange that works exactly like range but with floats
>>> (and rounding errors) is all you want, that's so trivial to write that it
>>> doesn't seem worth putting in the stdlib, unless the use case is very
>>> common.
>>
>> In numerical computing the use-case is extremely common, in fact I would say
>> it practically universal. Ideally it would be vectorized, but in practice
>> this is often not possible, requiring the use of loops.
>
> Can you give a more specific example? I believe your problem is real,
> but as a numerical programmer I can't think of an example of where
> I've ever wanted anything like this, so it's hard for me to visualize
> what exactly you're talking about.
>
> And is what you want just:
>
> class FRange:
> def __init__(start, stop, step):
> self.start = start
> self.stop = stop
> self.step = step
>
> def __getitem__(self, i):
> x = self.start + i * self.step
> if x > self.stop:
> raise IndexError
> def __iter__(self):
> i = 0
> while True:
> try:
> yield self[i]
> except IndexError:
> return
> i += 1
This isn't really necessary; any type whose __getitem__ takes int values from 0 up to some point and then raises IndexError beyond that is automatically iterable (and the built-in sequence iterator is basically a C-optimized version of what you just wrote).
While we're at it, you probably also want __len__, __contains__ (one more place for naive float rounding problems…), __reversed__, index, count, a __getitem__ that handles slices and negative values, and __hash__. All pretty simple to add. (In fact, if you inherit collections.abc.Sequence you'll get everything but __getitem__, __len__, and __hash__ for free, but you'd probably want to implement __contains__, index, and count anyway, because the default versions will be linear instead of constant.)
More information about the Python-ideas
mailing list