2

I have a class that utilizes floating ranges. Everything is working except my getitem() method. I am trying to follow this:

Python: Implementing slicing in __getitem__

This what it needs to do \ look like as far invoking it is concerned:

>>> my_range = float_range(0.5, 7, 0.75)
>>> list(my_range[:2])
[0.5, 1.25]
>>> list(my_range[-1:100])
[6.5]
>>> list(my_range[-3:])
[5.0, 5.75, 6.5]
>>> list(my_range[::2])
[0.5, 2.0, 3.5, 5.0, 6.5]

My code thus far:

from math import ceil


class float_range:

    def __init__(self, start, stop=None, step=1.0):
        if stop is None:
            start, stop = 0, start
        (self.start, self.stop, self.step) = (start, stop, step)

    def __len__(self):
        return max(ceil((self.stop-self.start) / self.step), 0)

    def __iter__(self):
        i = self.start
        for _ in range(len(self)):
            yield i
            i += self.step

    def __reversed__(self):
        i = self.start + (len(self)-1) * self.step
        for _ in range(len(self)):
            yield i
            i -= self.step

    def __getitem__(self, given):
        if isinstance(given, slice):
            i = self.start
            for _ in range(self.stop):
                yield i
                i += self.step


for n in float_range(0.5, 2.5, 0.5):
    print(n)

print(list(float_range(3.5, 0, -1)))

for n in float_range(0.0, 3.0):
    print(n)

for n in float_range(3.0):
    print(n)

print(len(float_range(0.5, 2.5, 0.5)))

print(list(reversed(float_range(0.5, 2.5, 0.5))))
floater = float_range(1, 10, 2)
print(len(floater))

for item in floater:
    print(item)

reverse_range = reversed(float_range(0.5, 7, 0.75))
print(list(reverse_range))
# [6.5, 5.75, 5.0, 4.25, 3.5, 2.75, 2.0, 1.25, 0.5]
my_range = float_range(0.5, 7, 0.75)
print(list(my_range[:2]))

I know the for loop in my __getitem() method is wrong, but I just don't understand how to get it to stop using the passed in slice notation.

Output:

0.5
1.0
1.5
2.0
[3.5, 2.5, 1.5, 0.5]
0.0
1.0
2.0
0
1.0
2.0
4
[2.0, 1.5, 1.0, 0.5]
5
1
3
5
7
9
[6.5, 5.75, 5.0, 4.25, 3.5, 2.75, 2.0, 1.25, 0.5]
[0.5, 1.25, 2.0, 2.75, 3.5, 4.25, 5.0]
MarkS
  • 1,455
  • 2
  • 21
  • 36
  • Are you aware that [`numpy.linspace`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) and [`numpy.arange`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html) exist? – mkrieger1 Aug 13 '18 at 18:37
  • Concerning your question, you need to somehow use the `start`, `stop`, and `step` attributes of the slice object passed in (named `given` in your case). – mkrieger1 Aug 13 '18 at 18:40
  • @mkrieger1, I thought of that, but that link above states that the correct way would be to just pass in a slice object. – MarkS Aug 13 '18 at 18:59
  • Yes, and then you need to *use* it. – mkrieger1 Aug 13 '18 at 19:00

0 Answers0