Skip to content

Instantly share code, notes, and snippets.

@juanarrivillaga
Created January 24, 2021 22:33
Show Gist options
  • Save juanarrivillaga/f4372d098913a1f66764833376f0e020 to your computer and use it in GitHub Desktop.
Save juanarrivillaga/f4372d098913a1f66764833376f0e020 to your computer and use it in GitHub Desktop.
Explaining `range` objects
class Range:
def __init__(self, start, stop, step=1):
self.start = start
self.stop = stop
self.step = step
def __getitem__(self, index):
result = self.start + index*self.step
if result >= self.stop:
raise IndexError("Index out of range")
return result
def __len__(self):
"""
See https://github.com/python/cpython/blob/8dfe15625e6ea4357a13fec7989a0e6ba2bf1359/Objects/rangeobject.c#L890
"""
return 1 + (self.stop - self.start - 1) // self.step
def __repr__(self):
return f"Range({self.start}, {self.stop}, {self.step})"
def __iter__(self):
return RangeIterator(self)
class RangeIterator:
def __init__(self, rng):
self._rng = rng
self._current_index = 0
def __iter__(self):
return self
def __next__(self):
try:
value = self._rng[self._current_index]
except IndexError:
raise StopIteration
self._current_index += 1
return value
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment