【问题标题】:xrange versus itertools.count Python 2.7xrange 与 itertools.count Python 2.7
【发布时间】:2015-02-24 20:39:00
【问题描述】:

我想运行一个从开始值到结束值的范围。它在低数字上工作正常,但是当它变得太大时会导致溢出错误,因为 int 太大而无法转换为 C Long。我正在使用 Python 2.7.3。

我在此处阅读了OverflowError Python int too large to convert to C long 关于使用itertools.count() 方法的内容,除了该方法与xrange 方法的工作方式不同,它通过步进而不是声明结束范围值。

itertools.count() 可以设置为像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)

【问题讨论】:

标签: python python-2.7 itertools xrange


【解决方案1】:

您可以使用itertools.islice() 结束count

from itertools import count, islice

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

islice()end_value - start_value 值被迭代后引发 StopIteration

支持 1 以外的步长并将其全部放在一个函数中:

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)

然后像使用 range()xrange() 一样使用 irange(),但现在可以使用 Python long 整数:

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

【讨论】:

  • 这工作得很好,所以看起来@Martijn,我只需要使用部分代码(围绕islice),它处理的数字要大得多。我在值上看到的唯一内容是显示在每个值末尾的“L”后缀,但据我所知,它按预期工作。
  • @Python_newbie:Python long 整数在表示时添加了L (repr(value)) 以表明它们是长整数,将它们与“小”整数区分开来。
猜你喜欢
  • 2012-11-28
  • 2021-07-13
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多