我已经编写了一些多次调用函数的小Python脚本。该函数应始终返回其他值,因为缓冲区始终是唯一的(由于.pop(0)
)。但回报总是相同的。如果我像 result1 = x(buffer1)
和循环外result2 = x(buffer2)
调用该函数两次,则结果是唯一的。但是一旦我尝试像伪代码中那样调用函数,结果总是相同的。似乎 Python 只执行一次函数,然后打印它的结果。我已经在 PHP
和 VB.net
中实现了这段代码,并且它正常工作。这似乎是一个特定的Python的东西。有人可以解释一下。:/
伪代码
function x()
list = []
buffer = []
for l in list:
buffer.append(l)
if len(buffer) == y:
return = x(buffer)
buffer.pop(0)
蟒蛇代码
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
而不是function
来定义函数...
顺便说一句,你使用这种> return = x(buffer)
回报方式的目的是什么。 ??=
中间在做什么??
另外,在使用之前,我没有看到任何添加到list
中的内容。您是否正在向该function
进行任何list
??否则,您也会在每次通话中重新创建它。
multiplier = 2 / (relevant + 1) # floats are rounded! => * with 0 => same result
multiplier = float(2) / float(relevant + 1) # unique values! :)
我认为这就是问题所在:
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
设置返回值。所以问题是你提前退出循环。