0

for ループと if ステートメントを使用して、範囲内のすべての数値をチェックしようとするコードを書いています。ループは最初のチェックの後に停止し、メッセージが 間違った型 ,,None,, expected integerでエラーをスローします。

以下を実行する関数 findLine(prog, target) を定義します。prog は、getBASIC() によって生成される型のような、BASIC プログラムを含む文字列のリストであると仮定します。target は、GOTO ステートメントのターゲットである行番号を含む文字列であると仮定します。この関数は、prog[i] がターゲットと等しいラベルを持つ行になるように、インデックス i (0 から len(prog)-1 までの数値) を返す必要があります。ヒント 入出力例: 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])

これにより、探しているものにはるかに近いLequal toが生成されます。['10', '20']最後のステップは、その配列内のターゲットのインデックスを取得することです (これは既に方法を知っています!)

于 2012-08-20T19:38:56.237 に答える
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 に答える
1

None の理由は、コードが関数の最後から外れているためです。if j == int(target)ブロックは実行されません。

あなたのコードは本当に意味がありません。ループでjは、0 から、関数に渡す BASIC コードの行数までの値を取ります。したがって、あなたの例でjは、0、次に 1 になります。ターゲット行である 20 になることはありません。やりたいようですねif L[j][0] == target

それに加えて、リストの長さを使用して、非 Pythonic な方法でリストを反復処理しています。for ループを Python で使用する方法については、Python チュートリアルを参照してください。

于 2012-08-20T19:40:12.830 に答える