range()
并xrange()
为 10 位数字工作。但是 13 位数字呢?我在论坛里没有找到任何东西。
9 回答
你可以试试这个。与范围相同的语义:
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
那样
创建范围没有问题,只要您不想要 10**13 个元素,例如
range(10**14,10**15,10**14)
给
[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
在 64 位 Python 上:
>>> xrange(9999999999999)
xrange(9999999999999)
我不会使用range()
13 位数字。我可怜的机器将无法保存结果列表。
我不认为它会起作用。由于 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
有关相关问题,请参见此处。
range(x) 返回一个列表。Python 列表不能包含那么多元素。如果您需要进行数万亿次循环,您应该使用 xrange() 来遍历这些数字。?
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
这不是一个完整的解决方案(它不处理负面步骤),但它应该能让你继续前进。
range() 和 xrange() 之间的区别在于第一个返回整个列表,而第二个返回一个生成器,该生成器根据需要生成每个数字。第二个应该适用于任何数字,无论有多大。
在 Python 3.0 中,xrange() 已经消失,并且 range() 的行为与之前的 xrange() 一样。
为了解决这个问题,你不需要这么长的数字,因为你只需要素数,你可以使用平方根:
for i in xrange(2, int((n+1)**0.5)):