如果是循环,则为非类型

时间:2012-08-20 19:33:45

标签: python python-3.x

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

3 个答案:

答案 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

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