xrange versus itertools.count Python 2.7

2019-07-03 07:30发布

问题:

I want to run a range from a start to an end value. It works fine on low numbers but when it gets too large it causes an overflow error as int too large to convert to C Long. I am using Python 2.7.3.

I read here OverflowError Python int too large to convert to C long on using the itertools.count() method except that method works differently to the xrange method by stepping as opposed to declaring an end range value.

Can the itertools.count() be set up to work like xrange()?

print "Range start value"
start_value = raw_input('> ')
start_value = int(start_value)

print "Range end value"
end_value = raw_input('> ')
end_value = int(end_value)

for i in xrange(start_value, end_value):
    print hex(i)

回答1:

You can use itertools.islice() to give count an end:

from itertools import count, islice

for i in islice(count(start_value), end_value - start_value):

islice() raises StopIteration after end_value - start_value values have been iterated over.

Supporting a step size other than 1 and putting it all together in a function would be:

from itertools import count, islice

def irange(start, stop=None, step=1):
    if stop is None:
        start, stop = 0, start
    length = 0
    if step > 0 and start < stop:
        length = 1 + (stop - 1 - start) // step
    elif step < 0 and start > stop:
        length = 1 + (start - 1 - stop) // -step
    return islice(count(start, step), length)

then use irange() like you'd use range() or xrange(), except you can now use Python long integers:

>>> import sys
>>> for i in irange(sys.maxint, sys.maxint + 10, 3):
...     print i
... 
9223372036854775807
9223372036854775810
9223372036854775813
9223372036854775816