xrange versus itertools.count Python 2.7

穿精又带淫゛_ 提交于 2020-01-04 02:16: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


来源:https://stackoverflow.com/questions/27675673/xrange-versus-itertools-count-python-2-7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!