【问题标题】:Why does a function return the error "list index out of range" in Python?为什么函数在 Python 中返回错误“列表索引超出范围”?
【发布时间】:2017-07-24 04:24:31
【问题描述】:

这段代码是用 Python 3 编写的。我试图找到第 10001 个素数。

#10001st prime number
mylist=[]
def prime_index(n):
    for i in range(99**99):
        for x in range(2, int(i**1/2)):
            if i % x == 0:
                return False
            return True
            mylist.append(i)
        n=int(n+1)
        print(mylist[n])
        break
prime_index(10001)

当我运行时,它说“列表索引超出范围”,指的是print(mylist[n])。 但是,我一直在mylist.append(i) 中将素数添加到列表中。所以有人可以告诉我这里有什么问题,因为我不明白发生了什么。 99**99 是不是太小了?或者更微妙的代码问题?

【问题讨论】:

  • print() 执行时,我想你会对n 的值感到惊讶。将一些调试打印语句添加到您的代码中,以确定它执行时发生的情况;通过这种方式,您可以观看您的代码运行。特别是,在 print() 执行之前打印出 n 的值,这样您就可以看到代码试图显示的数组索引。
  • 就目前而言,当mylist 的长度仍为 0 时,您的代码第一次到达违规行。
  • range(99**99) 生成一个与mylist 无关的数字列表。
  • 没有理由使用int(n+1),只需使用n+1
  • 可能n=n+1print 语句应该在for 循环之后。而且你不应该有break,因为这意味着循环只会运行一次。

标签: python list python-3.x primes


【解决方案1】:

问题在于,一旦找到(或没有)第一个素数,您就会尝试打印出第 10001 个元素。另外,请注意,您从例程返回时没有找到 任何 质数——如果您要走那么远的话。无法到达 append 语句。

你得到 print 语句只是因为你的第一次迭代有 i = 0,所以你根本没有进入 for 循环。

请遵循发布指南:花时间研究如何生成素数。它可以比你做的要快得多,并且会给你一个漂亮、简洁的代码来放入你的程序中。

【讨论】:

    【解决方案2】:

    99**99 不算小;如果你真的打印它,你就远远超出了你的需要(如果你试图用完它,你永远不会完成,这是 657 位的工作)。但是你的循环没有意义;如果执行一次,您的内部循环将立即返回 TrueFalse

    对你来说“幸运的是”,它甚至不会执行一次。第一个外部循环第一次将i 设置为0,因此内部循环根本不运行(旁注,您可能需要i ** (1/2),而不是i ** 1 / 2;求幂的优先级高于除法)。因为它没有运行,你最终会索引到一个空列表(并要求索引 10001 不少于)。

    这段代码中的问题太多了,无法一一解决;寻找其他试验部门的主要查找代码,以了解它应该是什么样子。

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2016-01-06
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多