为什么Python说"不合适的参数类型"对于xrange?

时间:2014-12-24 08:47:19

标签: python types arguments xrange

我的代码是:

def euler7():
    prime=1
    val=0
    for num in xrange(3, 9999999999, 2):
        for n in xrange(1, num):
            if num%n==0:
                numb=0
                break
            else:
                numb=1
                val=num
            if numb==1:
                prime=prime+1
            if prime==10001:
                return val

但是,它说for循环有一个不适当的参数类型。我不知道这是否意味着它没有将值视为整数,或者发生了什么。感谢

2 个答案:

答案 0 :(得分:1)

由于代码是作为C程序(https://docs.python.org/2/library/functions.html#xrange)执行的,因此

xrange不适用于大数字。

根据文件 -

  

CPython实现细节:xrange()旨在简单明了   快速。实现可能会对此实施限制。 C   Python的实现将所有参数限制为本机C long   (“短”Python整数),也要求数量   元素适合原生C长。如果需要更大的范围,   可以使用itertools模块制作备用版本:   islice(count(start,step),(stop-start + step-1 + 2 *(step< 0))// step)。

我不确定你有什么系统规格,但一般来说c int是2 ^ 16-1而c long是2 ^ 32-1。

答案 1 :(得分:-1)

来自文档:

  

xrange()旨在简单快捷。实现可能会对此实施限制。 Python的C实现将所有参数限制为本机C long(“短”Python整数),并且还要求元素的数量适合本机C long。如果需要更大的范围,可以使用itertools模块制作备用版本:islice(count(start,step),(stop-start + step-1)// step)。

Python开始使用long取决于平台,sys.maxint允许您查询该点。在32位Python可执行文件上,该点位于2147483648(10位)。长期只受记忆约束。

我建议使用生成器重新实现xrange()

def myxrange(a1, a2=None, step=1):
    if a2 is None:
        start, last = 0, a1
    else:
        start, last = a1, a2
    while cmp(start, last) == cmp(0, step):
        yield start
        start += step