簡體   English   中英

Python 2.7.2 Win32#遍歷列表,列表的緩沖區部分,多次調用函數,返回相同

[英]Python 2.7.2 Win32 # Loop Through List, Buffer Part Of List, Call Function Multiple Times, SAME Return

我已經編寫了一些小的Python腳本,該腳本多次調用一個函數。 該函數應始終返回其他值,因為該緩沖區始終是唯一的(由於.pop(0) )。 但是回報總是一樣的。 如果我在循環外部兩次調用函數result1 = x(buffer1)result2 = x(buffer2) ,則結果是唯一的。 但是,一旦我嘗試像偽代碼中那樣調用函數,結果總是相同的。 似乎Python僅執行一次該函數,然后打印其結果。 我已經在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)

您正在將緩沖區傳遞給該函數,但沒有使用它。 :-

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)

我們使用def not function定義function ...

順便說一句,使用此-> return = x(buffer)返回方式的目的是什么。 ?? 那是什么=在兩者之間做?

另外,在使用它之前,我看不到任何添加到list內容。.您是否將任何list粘貼到該function 否則,您也會在每個電話上重新創建該文件。

我認為這是問題所在:

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設置返回值。 因此,問題在於您要盡早退出循環。

multiplier = 2 / (relevant + 1) # floats are rounded! => * with 0 => same result
multiplier = float(2) / float(relevant + 1) # unique values! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM