I have created iterator and generator versions of Python's range()
:
Generator version
def irange(*args):
if len(args) > 3:
raise TypeError('irange() expected at most 3 arguments, got %s' % (len(args)))
elif len(args) == 1:
start_element = 0
end_element = args[0]
step = 1
else:
start_element = args[0]
end_element = args[1]
if len(args) == 2:
step = 1
elif (args[2] % 1 == 0 and args[2] != 0):
step = args[2]
else:
raise ValueError('irange() step argument must not be zero')
if((type(start_element) is str) or (type(end_element) is str)
or (type(step) is str)):
raise TypeError('irange() integer expected, got str')
count = 0
while (( start_element + step < end_element )
if 0 < step else
( end_element < start_element + step )) :
if count == 0:
item = start_element
else:
item = start_element + step
start_element = item
count +=1
yield item
Iterator version
class Irange:
def __init__(self, start_element, end_element=None, step=1):
if step == 0:
raise ValueError('Irange() step argument must not be zero')
if((type(start_element) is str) or (type(end_element) is str)
or (type(step) is str)):
raise TypeError('Irange() integer expected, got str')
self.start_element = start_element
self.end_element = end_element
self.step = step
self.index = 0
if end_element is None:
self.start_element = 0
self.end_element = start_element
def __iter__(self):
return self
def next(self):
if self.index == 0:
self.item = self.start_element
else:
self.item = self.start_element + self.step
if self.step > 0:
if self.item >= self.end_element:
raise StopIteration
elif self.step < 0:
if self.item <= self.end_element:
raise StopIteration
self.start_element = self.item
self.index += 1
return self.item
Usage
>>> for i in irange(2,5):
... print i,
2 3 4
>>> for i in irange(2,-3,-1):
... print i,
2 1 0 -1 -2
>>> for i in Irange(3):
... print i,
0 1 2
I would like to know if the approach is correct.
xrange
? Or are you just testing your ability to write generators/iterators? \$\endgroup\$ – Adam Wagner Nov 14 '12 at 18:10def irange(*args): return iter(xrange(*args))
\$\endgroup\$ – Adam Wagner Nov 14 '12 at 19:03