diff --git a/Python-range-function-improved-for-Python2.md b/Python-range-function-improved-for-Python2.md new file mode 100644 index 0000000..1c12cf6 --- /dev/null +++ b/Python-range-function-improved-for-Python2.md @@ -0,0 +1,58 @@ +# 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 +``` \ No newline at end of file