为什么两次调用此函数会导致错误?

时间:2015-01-20 12:49:24

标签: python

我在调用函数两次时遇到问题。如果我评论我的最后3行并保留show(),我就不会收到任何错误,而且事情就像他们想象的那样。但是,如果我没有评论它们再次调用最后一个函数会给我这个错误:

Traceback (most recent call last):
  File "second_1.py", line 29, in <module>
    domega=c_d(len(t),t,z)
  File "second_1.py", line 25, in c_d
    dy[1:-1]=(y[2:]-y[0:-2])/(x[2:]-x[0:-2])
TypeError: unsupported operand type(s) for -: 'list' and 'list'

这是功能:

import numpy as np
from pylab import *
import time

t_initial=time.time()
clf()
t,hp,hn= np.loadtxt("Richardson.dat", usecols=(0,1,2),comments='#', unpack=True)     # to select just a few columns
print(time.time()-t_initial)  

def phi(y,x):
    return(np.arctan(y/x))

phase=[0.0]*len(t)
phase=phi(hp[0:],hn[0:])
#plot(t,phase)
#show()    

def c_d(order,x,y):
    dy=[0.0]*order
    dy[0]=(y[1]-y[0])/(x[1]-x[0])
    dy[-1]=(y[-1]-y[-2])/(x[-1]-x[-2])
    dy[1:-1]=(y[2:]-y[0:-2])/(x[2:]-x[0:-2])
    return(dy);
    z=c_d(len(t),t,phase);
    plot(t,z)
    print(len(z)-len(t))
    domega=c_d(len(t),t,z)
    plot(t,domega)
    show()

3 个答案:

答案 0 :(得分:1)

错误消息中非常清楚地解释了该问题: &#39; - &#39;操作数不适用于类型列表。

(y[2:]-y[0:-2])/(x[2:]-x[0:-2])

y [2:]切片列表并返回一个列表。 y [0:-2]切片也是一个列表并返回一个列表。所以你有2个列表。

y[2:] (a list)   -(your operator)   y[0:-2] (a list)

列表 - 列表未定义(没有语法:&#39; listObject&#39; - &#39; listObject&#39;)。

但是:为列表定义了+运算符(示例):

l = ["ja"]
m = ["nein"]

n = l + m

print n
# output: ['ja', 'nein']

看看这些不同类型的可能运营商: https://docs.python.org/2/library/stdtypes.html

答案 1 :(得分:0)

正如Cyber​​和Programming Is Awesome所述,错误在线

(y[2:]-y[0:-2])/(x[2:]-x[0:-2])

您实际上尝试减去列表。

您可以明确写出:

for i in range(1, order - 1):
    dy[i]=(y[i+1]-y[i-1])/(x[i+1]-x[1-1])

答案 2 :(得分:0)

如其他答案中所述,您无法减去常规Python列表。那么为什么它第一次工作,而第二次失败呢?我们来看看代码。

t, hp, hn = np.loadtxt(...)
...
def c_d(order, x, y):
    dy       = [0.0] * order
    dy[ 0]   = (y[1] -y[0])    / (x[ 1]-x[0])
    dy[-1]   = (y[-1]-y[-2])   / (x[-1]-x[-2])
    dy[1:-1] = (y[2:]-y[0:-2]) / (x[2:]-x[0:-2])
    return dy

z = c_d(len(t), t, phase)
...
domega = c_d(len(t), t, z)
...

当您第一次拨打c_d时,参数xy似乎是numpy个数组(至少tphasenumpy函数调用的结果,对于那些,-是合法的操作。但是在c_d内,您创建并最终返回常规 Python列表dy,因此当您再次使用<{1}} 时第一次调用的结果为c_d,此部分y将失败,因为y[2:]-y[0:-2]现在是常规列表。

确保您的y也是dy数组,即numpydy = np.array([0.0] *order),然后它应该有用。