Add Python-range-function-improved-for-Python2.md
parent
cee896a9ef
commit
b9dfd8d1cd
|
@ -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
|
||||
```
|
Loading…
Reference in New Issue