# range function improved for Python2 ## This class allows you to have a similar performance to the python3 range in python2 This class doesn't load all the elements of the range at the same time in a list in memory. ```Python class range: def __init__(self, start, end=None, step=None): if step is not None and step > 0 and end is not None and end <= start: raise ValueError("The start value is lower than the end") elif end is not None and end < start and step is not None and step > 0: raise ValueError("The end value can't be higher than the start if the step is higher than 0") elif step == 0: raise ValueError("Step value can't be 0") if end is None: end = start start = 0 if step is None: step = 1 self.start = start - step self.end = end self.step = step self.__actual = 0 def __getitem__(self, index): if index < 0: raise IndexError("Index value can't be lower than 0") output = self.step * (index + 1) + self.start if self.end > self.start and output >= self.end: raise IndexError("Index out of range") elif self.end < self.start and output <= self.end: raise IndexError("Index out of range") return output def __next__(self): val = None try: val = self.__getitem__(self.__actual) except IndexError: raise StopIteration() self.__actual += 1 return val >>> from_0_to_9 = range(10) >>> print(list(from_0_to_9)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> from_1_to_minus9 = range(1, -10, -1) >>> for n in from_1_to_minus9: >>> print(n) 1 0 -1 ... -8 -9 ```