0

我正在编写一些代码,在其中我尝试使用 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
4

3 回答 3

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等于['10', '20'],这更接近于您正在寻找的内容。最后一步是获取该数组中目标的索引(您已经知道该怎么做!)

于 2012-08-20T19:38:56.237 回答
1

它是 None 的原因是你的代码从函数的末尾掉了下来。该if j == int(target)块永远不会运行。

你的代码真的没有意义。在您的循环中,j将采用从 0 到您传递给函数的 BASIC 代码的行数。因此,在您的示例j中将等于 0,然后是 1。它永远不会等于 20,这是您的目标行。看来你想做if L[j][0] == target

除此之外,您还通过使用列表的长度以非 Python 的方式迭代列表。您应该阅读Python 教程以了解如何以 Python 方式使用 for 循环。

于 2012-08-20T19:40:12.830 回答
1
def findLine(prog, target):
  for i in range(0, len(prog)):
      if prog[i].startswith(target):
          return i

这应该是您的问题陈述的答案。

于 2012-08-20T19:50:58.057 回答