【问题标题】:Error message: unsupported operand type(s) for ___错误消息:___ 的操作数类型不受支持
【发布时间】:2015-04-05 17:32:27
【问题描述】:

该程序用于计算素数并将它们保存到文件中。保存功能尚未正确编程,请忽略。该程序通过将奇数与先前的素数进行比较来工作。如果它不是这些数字的倍数,那么它就是质数。理论上它应该可以工作,但是当我尝试将数字除以列表中的素数时,它会返回错误消息:

Traceback(最近一次调用最后一次): 文件“C:\Users\Archie\Desktop\maths python\prime\prime v1.3.py”,第 51 行,在 primeCheck(数量) primeCheck 中的文件“C:\Users\Archie\Desktop\maths python\prime\prime v1.3.py”,第 8 行 检查 = int(num) / listImport TypeError: 不支持的操作数类型 /: 'int' 和 'list'

您能否建议我如何解决此问题或提出不同的解决方法。

def primeCheck(num):
    divider = 2
    refresh = 0
    firstPoint = 0
    secondPoint = 1
    while refresh == 0:
        listImport = primeList[firstPoint:secondPoint]
        check = int(num) / listImport
        if (check.is_integer()):
            refresh = 1
        else:
            firstPoint = firstPoint + 1
            secondPoint = secondPoint + 1
        if secondPoint > len(primeList):
            file.write(str(num) + "\n")
            print(str(num))
            global x
            x = x + 1
            refresh = 1
            primeList.append


\\        if (int(num)/divider).is_integer():
\\            if divider == num:
\\                file.write(str(num) + "\n")
\\                print(str(num))
\\                global x
\\                x = x + 1
\\                refresh = 1
\\            else:
\\                refresh = 1
\\        else:
\\            divider = divider + 1

global file
repeat = input("How many numbers do you want to add to the existing file?\n")
file = open("Prime results v1.3.txt", "r")
global x
x = 1
num = file.readline()
file.close()
global file
file = open("Prime results v1.3.txt", "a")
num = int(num)

global primeList
primeList = [2]

while x <= int(repeat):
    primeCheck(num)
    num = num + 2

file.close()

双斜线区域是我之前尝试过的一种方法,效果很好,但是这种方法更有效。

【问题讨论】:

    标签: python windows-7 primes divide


    【解决方案1】:

    有很多方法可以改进您的代码。但是错误的原因是当你这样做primeList[firstPoint:secondPoint]时会得到一个列表。

    关于这个主题的更多信息在 SO 问题中得到了很好的解释:Explain Python's slice notation

    当您只想索引列表中的单个项目时,可以使用 my_list[idx](注意:Python 从 0 开始索引)来实现,它返回列表 my_list 的位置 idx 处的项目。

    在我看来,firstPointsecondPoint 之间的差异总是等于 1(如果我很好地理解了您的代码)。所以你根本不必使用 secondPoint 。 只需写primeList[firstPoint],你会得到与使用primeList[firstPoint:secondPoint]时相同的结果。

    线上也有错误

    primeList.append

    这是一个函数而不是函数调用。您可能想要这样做:

    primeList.append(num)

    另一个棘手的部分可能是,如果你使用 Python2.x 而不是 Python 3.0,两个整数的除法又是一个整数(例如4/3 = 0)。 所以我建议稍微修改一下:

    check = float(num) / listImport
    

    4/3 = 1.3333333333333333is_integer() 函数在 int 上调用时会引发错误(如果您使用 Python 2.x,则 int/int 返回 int 并因此引发错误。

    示例(Python 2.7):

    >>> 1/4
    0
    >>> float(1)/4
    1.3333333333333333
    

    【讨论】:

      【解决方案2】:

      您似乎正在使用firstPointsecondPoint 尝试对primeList 的特定元素进行索引。根据你当前的代码,如果primeList = [2,3,5,7]firstPoint, secondPoint = 0, 1,那么你有listImport = primeList[0:1] = [2]——你最终会得到一个包含你想要的元素的列表,这就是为什么它说你不能划分一个 int 和一个列表.

      相反,您需要在列表中编制索引。所以primeList[0]=2primeList[1]=3 等等。这样你就可以得到实际的元素,而不是列表的一部分,除此之外你只需要跟踪一个索引。

      您可以阅读有关 Python 列表操作的更多信息 here -- 他们的文档全面而​​直观。

      【讨论】:

        【解决方案3】:

        在第 8 行中,您尝试将整数除以列表。这没有定义。你想要的是将一个整数除以另一个整数。请注意,alist[i:i+1] 仍然是一个列表。您想要alist[i],或者更好的是,使用for item in list: 遍历列表。

        【讨论】:

          猜你喜欢
          • 2020-07-27
          • 2018-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多