我正在编写一些代码,我尝试使用for循环和if语句检查范围中的每个数字。循环在第一次检查后停止,并抛出错误消息错误类型,无,预期整数,我会告诉你我被要求做的事情:
定义函数findLine(prog,target)以执行以下操作。假设prog是包含BASIC程序的字符串列表,类似于getBASIC()生成的类型;假设target是一个包含行号的字符串,该行号是GOTO语句的目标。该函数应该返回索引i(0和len(prog)-1之间的数字),使得prog [i]是其标签等于target的行。暗示 样本输入/输出:如果你打电话 findLine(['10 GOTO 20','20 END'],'10')
def findLine(prog, target):
L=[]
for i in range(0, len(prog)):
L=L+prog[i].split()
for j in range(0,len(L)):
i=L.index(L[j])
if j == int(target):
i=i//3
return i
这些是一些信息:
Running findLine(['10 GOTO 20', '20 END'], '20')… Error: findLine(['10 GOTO 20', '20 END'], '20') has wrong type "None" Type, expected Integer
答案 0 :(得分:2)
第一次检查后循环没有停止:相反,它永远不会成功返回。此函数基于以下循环返回:
for j in range(0,len(L)):
i=L.index(L[j])
if j == int(target):
i=i//3
return i
但如果永远不满足条件j == int(target)
,则循环将结束,函数findLine
将返回None
。
ETA:现在您已经解释了任务的内容:构建L
列表不是解决问题的正确方法:
for i in range(0, len(prog)):
L=L+prog[i].split()
这将产生['10', 'GOTO', '20', '20', 'END']
。在这种情况下,你不知道哪一行是哪一行!然而,分裂它是正确的方向。如果您只是从每个分割线添加标签,该怎么办:
for i in range(0, len(prog)):
L.append(prog[i].split()[0])
这将产生等于L
的{{1}},这更接近您正在寻找的内容。最后一步是获取该数组中目标的索引(您已经知道该怎么做!)
答案 1 :(得分:1)
它是None的原因是因为你的代码在函数结束时掉线了。 if j == int(target)
块永远不会运行。
你的代码真的没有意义。在循环中,j
将采用从0到最多行的值,您将传递给函数的BASIC代码。因此,在您的示例中,j
将等于0,然后是1.它将永远不会等于20,这是您的目标行。您似乎想要if L[j][0] == target
。
除此之外,您还可以使用列表的长度以非语音方式迭代列表。您应该阅读the Python tutorial以了解如何以循环方式使用for循环。
答案 2 :(得分:1)
def findLine(prog, target):
for i in range(0, len(prog)):
if prog[i].startswith(target):
return i
这应该是您的问题陈述的答案。