12

range()xrange()为 10 位数字工作。但是 13 位数字呢?我在论坛里没有找到任何东西。

4

9 回答 9

12

你可以试试这个。与范围相同的语义:

import operator
def lrange(num1, num2 = None, step = 1):
    op = operator.__lt__

    if num2 is None:
        num1, num2 = 0, num1
    if num2 < num1:
        if step > 0:
            num1 = num2
        op = operator.__gt__
    elif step < 0:
        num1 = num2

    while op(num1, num2):
        yield num1
        num1 += step

>>> list(lrange(138264128374162347812634134, 138264128374162347812634140))
[138264128374162347812634134L, 138264128374162347812634135L, 138264128374162347812634136L, 138264128374162347812634137L, 138264128374162347812634138L, 138264128374162347812634139L]

另一种解决方案是使用,如文档itertools.islice中所建议的xrange那样

于 2010-02-02T20:12:45.760 回答
6

创建范围没有问题,只要您不想要 10**13 个元素,例如

range(10**14,10**15,10**14)

[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
于 2010-02-02T19:53:58.800 回答
6

如果您需要枚举整数,请尝试使用itertools

itertools.count(1000000000000)

它不应该为1000000000000元素列表分配内存

于 2010-02-02T20:11:45.847 回答
2

在 64 位 Python 上:

>>> xrange(9999999999999)
xrange(9999999999999)

我不会使用range()13 位数字。我可怜的机器将无法保存结果列表。

于 2010-02-02T19:52:07.757 回答
2

我不认为它会起作用。由于 cPython 实现的限制,像这样的函数len期望结果适合 4 字节整数。

在 Python 3.0 中:

>>> range(9999999999999)
range(0, 9999999999999)

看起来它有效,但是......

>>> len(range(9999999999999))
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    len(range(9999999999999))
OverflowError: Python int too large to convert to C ssize_t

有关相关问题,请参见此处

于 2010-02-02T19:52:52.403 回答
1

range(x) 返回一个列表。Python 列表不能包含那么多元素。如果您需要进行数万亿次循环,您应该使用 xrange() 来遍历这些数字。?

于 2010-02-02T20:03:27.687 回答
1

range() 和 xrange() 在最新的 Python 版本中工作;但是,在 2.5 或更低版本中,您需要解决从 int 到 long 的转换。

def irange(start, stop=None, step=1):
    if stop is None:
        stop = long(start)
        num = 1L
    else:
        stop = long(stop)
        num = long(start)
    step = long(step)
    while num < stop:
        yield num
        num += step

这不是一个完整的解决方案(它不处理负面步骤),但它应该能让你继续前进。

于 2010-02-02T20:08:08.833 回答
0

range() 和 xrange() 之间的区别在于第一个返回整个列表,而第二个返回一个生成器,该生成器根据需要生成每个数字。第二个应该适用于任何数字,无论有多大。

在 Python 3.0 中,xrange() 已经消失,并且 range() 的行为与之前的 xrange() 一样。

于 2010-02-02T20:14:53.373 回答
0

为了解决这个问题,你不需要这么长的数字,因为你只需要素数,你可以使用平方根:

for i in xrange(2, int((n+1)**0.5)):
于 2013-06-09T11:17:07.680 回答