1

正しいと思うコードが少しあります。ただし、値のベクトルを返す必要がありますが、代わりに単一の累積値を返します。

pExact = 0.8
pOvershoot = 0.1
pUndershoot = 0.1

def move(p, U):
    q = []
    for i in range(len(p)):
        s = pExact * p[(i - U) % len(p)]
        s = s + pOvershoot * p[(i - U - 1) % len(p)]
        s = s + pUndershoot * p[(i - U + 1) % len(p)]

        print i, s  # check if calculations are corrects
    q.append(s)

    return q        # should return a vector

p = [0, 1, 0, 0]
print move(p, 1)    # prints only cumulated value

[0.10000000000000001]ベクトルではなく1つの値しか出力しない理由を理解しようとしてい[0, 0.1, 0.8, 0.1]ます。

4

3 に答える 3

3

の識別が間違っていq.append(s)ます。forループ内にある必要があります。

正しいバージョンは次のとおりです。

pExact = 0.8
pOvershoot = 0.1
pUndershoot = 0.1

def move(p, U):
    q = []
    for i in range(len(p)):
        s = pExact * p[(i - U) % len(p)]
        s = s + pOvershoot * p[(i - U - 1) % len(p)]
        s = s + pUndershoot * p[(i - U + 1) % len(p)]

        print i, s  # check if calculations are corrects
        q.append(s)

    return q        # should return a vector

p = [0, 1, 0, 0]
print move(p, 1)    # prints only cumulated value
于 2012-09-19T08:47:57.207 に答える
2

q を使用する代わりに、より Pythonic な yield を使用します

def move(p, U):
    for i in range(len(p)):
        s = pExact * p[(i - U) % len(p)]
        s = s + pOvershoot * p[(i - U - 1) % len(p)]
        s = s + pUndershoot * p[(i - U + 1) % len(p)]

        print i, s  # check if calculations are corrects
        yield s

また、コードの問題は、前に 4 つのスペースのインデントを忘れたことです。q.append(s)

于 2012-09-19T08:48:31.567 に答える
1

それは単なるインデントの問題です。行q.append(s)は関数の主要部分と同じインデント レベルにあります。つまり、for ループの終了後にのみ実行されます。これを 1 レベル右に移動すると、ループの残りの部分と一緒になり、ループのたびに実行されます。

于 2012-09-19T08:48:12.580 に答える