【问题标题】:Why does Python say "Inappropriate Argument Type" for xrange? [duplicate]为什么 Python 对 xrange 说“不适当的参数类型”? [复制]
【发布时间】:2014-12-24 08:47:19
【问题描述】:

我的代码是:

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 循环的参数类型不合适。我不知道这是否意味着它没有将值视为整数,或者正在发生什么。谢谢

【问题讨论】:

  • 这不是我尝试时收到的错误消息。

标签: python types arguments xrange


【解决方案1】:

xrange 不适用于大数字,因为代码是作为 C 程序 (https://docs.python.org/2/library/functions.html#xrange) 执行的。

根据文档 -

CPython 实现细节:xrange() 旨在简单且 快速地。实现可能会施加限制来实现这一点。 C Python 的实现将所有参数限制为原生 C long (“短” Python 整数),并且还要求 元素适合原生 C 长度。如果需要更大的范围,则 可以使用 itertools 模块制作替代版本: islice(count(start, step), (stop-start+step-1+2*(step

我不确定你的系统规格是什么,但通常 c int 是 2^16-1 而 c long 是 2^32-1。

【讨论】:

  • Python 开始使用long 的点取决于平台,sys.maxint 允许您查询该点。在 32 位 Python 可执行文件上,该点位于 2147483648(10 位)。 Long 只受内存限制。
  • @MartijnPieters 不知道。谢谢!
  • @MartijnPieters 但在这里我认为他们仍在使用 2^32 的 C long。 Python long 不会在这里使用。
  • 我只是想在这里告知 Python 的“短”。引用的文档确实谈到了 C longs。
【解决方案2】:

来自文档:

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 位)。 Long 只受内存限制。

我会建议使用生成器重新实现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

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 2011-03-20
    • 2021-06-12
    • 2013-09-26
    • 2018-02-18
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多