Python初学者。我正在尝试编写一个非常简单的函数,用于计算由输入数组(或此处的“List”)表示的表达式的近似数值导数。我已经在matlab中编写了这个函数,它工作得很好,但是python抛出了一个索引错误,这让我很困惑。以下是我的尝试:
def diffr(h, myList = []):
d = [];
for n in myList:
if myList.index(n) > 0:
print(myList.index(n))
d_elem = (myList[n] - myList[n-1])/h
d.append(d_elem)
return d
其思想是从myList(n)
中减去myList(n-1)
,然后除以h
,然后按列表往下走。我意识到在第一次迭代中,myList(n-1)
将超出界限,这就是为什么我使用if子句来检查该条件。但是python只在5次迭代之后抛出这个错误:
索引器错误:列表索引超出范围
指向d_elem
行。有趣的是,当我注释掉那一行并让循环打印索引时,它就很好地通过了循环。有什么好处?提前谢谢。你知道吗
您正在处理列表内容和列表索引之间切换。您希望
n
成为索引,但是for循环和myList.index(n)
的使用都将其视为存储在列表中的值。你知道吗将循环更改为:
它将解决这个问题,因为
n
只取从1到列表长度减1的值。你甚至不需要if语句。你知道吗只需使用enumerate并从第二个元素开始使用每个元素:
您不需要指定
myList = []
作为参数,您将传入一个列表并使用list
作为默认参数通常不是一个好主意“Least Astonishment” in Python: The Mutable Default Argument在
for ind, n in enumerate(myList[1:],1)
中,ind
是每个元素的索引,我们添加1
作为参数指定从index 1
开始,因此n
将是myList[ind-1])
前面的一个元素在您的代码中,您使用元素来索引,因此,如果您的列表有4个元素,并且第一个数字是4或更大,那么您将尝试访问列表中不存在的索引处的元素,并立即出现索引错误。你知道吗
当您以这种方式遍历列表时,n从列表中产生精确的值。例如,假设您有一个列表[520,380],您的n将是520,然后是380。列表.索引(380)将返回1,因为[1]是列表中380的位置。打印
myList.index(n)
时,会得到一个索引。但是,在下一行中,您使用的是列表中的值(假设为380),这就是为什么会出现索引错误。列表[380]根本不存在。但是,当然,名单[列表.索引(380)]。你知道吗我建议您要么使用enumerate(正如我在编写本文时Padraic Cunningham所说的那样),要么将索引存储在单独的变量中,并使用它来代替
n
相关问题 更多 >
编程相关推荐