繁体   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