0

我编写了一些多次调用函数的小型 Python 脚本。该函数应始终返回其他值,因为缓冲区始终是唯一的(由于.pop(0))。但回报总是一样的。如果我在循环之外调用该函数两次result1 = x(buffer1),结果是唯一的。result2 = x(buffer2)但是一旦我尝试像在伪代码中那样调用函数,结果总是一样的。似乎 Python 只执行一次函数,然后打印它的结果。我已经在PHPand中实现了这段代码VB.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)

def我们使用not function...定义函数

顺便说一句,您使用这种->return = x(buffer)返回方式的目的是什么。?? 中间在做什么=??

list另外,在使用它之前,我没有看到任何添加到其中的内容。您是否将任何内容添加到list其中function?否则,您在每次通话时都会重新创建它。

于 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]--always。之后您使用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 回答