TypeError:“int”对象不可订阅{Python}

2024-05-18 04:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

from math import log

lliste = [2]
bovengrenspriem = eval(input('geef een getal van die je weten wil welke priemgetal het is? ',))

while not type(bovengrenspriem) == int:
    bovengrenspriem = eval(input('Foute invoer, geef een getal van die je weten wil welke priemgetal het is? ',))
    if type(bovengrenspriem) == int:
        break
counter = 2
x = 2
while lliste[-1] < bovengrenspriem or lliste[-1]== bovengrenspriem:
    liste = []
    for i in range (1,counter+1):
        if counter % i == 0:
            liste.append(i)
    if len(liste) == 2:
        lliste.append(counter)
        counter += 1
    else:
        counter +=1

lliste[:]= [float(p)for p in lliste]       
lliste[:]= [log(x[t]) for t in lliste]

错误就在这里。对于'int'对象不可下标,浮点行是我在测试,如果将我的列表中的每个数字转换成float可以修复它,但它似乎不起作用

^{pr2}$

Tags: inlogforinputifevalcountervan
2条回答

第一件事是。。。没有理由在这里使用eval有一种更简单的方法:

bovengrenspriem = eval(input('geef een getal van die je weten wil welke priemgetal het is? ',))

while not type(bovengrenspriem) == int:
    bovengrenspriem = eval(input('Foute invoer, geef een getal van die je weten wil welke priemgetal het is? ',))
    if type(bovengrenspriem) == int:
        break

即:

^{pr2}$

至于错误信息。。。。你试图在

x[t]

问题似乎在于:

lliste[:]= [log(x[t]) for t in lliste]

x[t]期望x是一个列表/数组等,而x被定义为2(一个int),因此int是不可订阅的。在

另外(除了真正的问题,你可以做一些简单的改进):

^{pr2}$

计数器总是增加的,因此您可以写下:

if len(liste) == 2:
    lliste.append(counter)

counter +=1

你可以改变

while lliste[-1] < bovengrenspriem or lliste[-1]== bovengrenspriem:

进入

while lliste[-1] <= bovengrenspriem:

用英语写评论(但是我来自荷兰,所以我懂荷兰语)。在

尽量使用好的命名变量和大写字母。列斯特可能是一个列表,但是第一个l和最后一个e是什么?莱斯特会更清楚,但最好是像primeListEnd(?)或者更合适的。在

改变

bovengrenspriem = eval(input('geef een getal van die je weten wil welke priemgetal het is? ',))

while not type(bovengrenspriem) == int:
    bovengrenspriem = eval(input('Foute invoer, geef een getal van die je weten wil welke priemgetal het is? ',))
    if type(bovengrenspriem) == int:
        break

比如说:

bovengrenspriem = None

while not type(bovengrenspriem) == int:
    ...

这将保存第一个重复原始行的副本。在

但是,更好的方法是使用单独的布尔值

upperBoundaryPrimeValid = False

while !upperBoundaryPrimeValid:
   ..
   if valid ... (pseudo code)
       upperBoundaryPrimeValid = True;

相关问题 更多 >