0

関数を複数回呼び出す小さなPythonスクリプトをコーディングしました。バッファは常に一意であるため(のため.pop(0))、関数は常に他の値を返す必要があります。しかし、リターンは常に同じです。result1 = x(buffer1)ループのように、そしてループの外で関数を2回呼び出すとresult2 = x(buffer2)、結果は一意になります。しかし、擬似コードのように関数を呼び出そうとすると、結果は常に同じになります。Pythonが関数を1回だけ実行し、その結果を出力しているように見えます。私はこのコードをPHPVB.netに実装しましたが、正常に機能します。それは特定のPythonのもののようです。誰か説明してもらえますか?:/

擬似コード

function x()
    list = []
    buffer = []
    for l in list:
        buffer.append(l)
        if len(buffer) == y:
            return = x(buffer)
        buffer.pop(0)

Python-コード

    ema_length = {66:0,74:0,89:0}
    def ema(length):    
        relevant = len(length)
        multiplier = 2 / (relevant + 1)
        sum_vector = 0
        for vector in length:
            sum_vector += vector    
            current_vector = vector
        sma = sum_vector / relevant
        if ema_length [relevant] == 0:
            ema_length [relevant] = sma 
        else:
            ema_length [relevant] = (current_vector - ema_length [relevant]) * multiplier + ema_length [relevant]
        return ema_length [relevant]

    buffer = []
    for d in data:
        buffer.append(d)
        if len(buffer) == 89:
            ema66 = ema(buffer [89 - 66:89]) # should be unique
            ema74 = ema(buffer [89 - 74:89]) # should be unique
            ema89 = ema(buffer [89 - 89:89]) # should be unique
            ema_overall = ema66 - ema74 - ema89 
            buffer.pop(0)
4

3 に答える 3

0

バッファを関数に渡していますが、使用していません。このようにしてください。:-

def x(old_buffer):
    list = []
    buffer = old_buffer
    for l in list:
        buffer.append(l)
        if len(buffer) == y:
            return = x(buffer)
        buffer.pop(0)

defnotを使用して関数を定義しますfunction...

ところで、これを使用する目的は何ですか->return = x(buffer)返品方法。?? その間に何をし=ているの?

listまた、使用する前に何も追加されていませlistfunction。それ以外の場合は、すべての呼び出しでそれも再作成しています。

于 2012-09-29T17:11:13.917 に答える
0

これが問題だと思います:

def ema(length):    
    # ...
    for vector in length:
        sum_vector += vector    
        current_vector = vector
    sma = sum_vector / relevant
    if ema_length [relevant] == 0:
        ema_length [relevant] = sma 
    else:
        ema_length [relevant] = (current_vector - ema_length [relevant]) * multiplier + ema_length [relevant]
    return ema_length [relevant]

この関数emaは、バッファーから値のリストを取得します。最後の要素は常に同じです(常にと呼ぶようにbuffer[89 - X:89])。ここで、要素をループし、それらを合計して現在の要素に設定current_vectorします。ループが終了すると、常にcurrent_vector最後のループに設定されbuffer[89]ます。その後、を使用current_vectorして戻り値を設定します。したがって、問題は、ループを早期に終了することです。

于 2012-09-29T18:37:05.790 に答える
0
multiplier = 2 / (relevant + 1) # floats are rounded! => * with 0 => same result
multiplier = float(2) / float(relevant + 1) # unique values! :)
于 2012-10-03T02:46:26.610 に答える