这是一个家庭作业,要求定义一个函数stddev(xs(,用于计算数字列表的标准偏差。(标准偏差是通过将列表中每个数字减去的平均值之和的平方根除以项总数得出的。(我写了一个单独的函数来计算平均值,我验证了它的有效性,但我在使用标准偏差函数时遇到了问题,因为我只是让它返回0.0。
旁注:唯一允许我在这个任务中使用的内置列表函数是长度。(即,我不允许使用附加、删除等(
这是我的代码:
import math
def mean(xs):
total = 0
for i in range (0, len(xs)):
total += xs[i]
mean = total / len(xs)
return mean
def stddev(xs):
sum = 0
count = 0
average = mean(xs)
for i in range (0, len(xs)):
sum = sum + (xs[i] - average)
count += 1
sd = math.sqrt (sum/count)
return sd
list = [15, 10, 30, 50, 40]
print (stddev(list))
我想知道为什么它返回0.0,而不是我想要的标准偏差。
主要错误
你忘了取绝对值。方差和标准差不是差的总和,而是距离或绝对差的总和。
更换以下线路:
sum = sum + (xs[i] - average)
带有:
sum = sum + abs(xs[i] - average)
其他意见
阴影内置
我强烈建议您永远不要将变量命名为sum
或list
。这两个名称是python中内置函数的名称,就像len
或range
一样。隐藏内置程序的名称是非常不鼓励的,并可能导致意想不到的后果。
以下是python中要避免的内置名称的完整列表:https://docs.python.org/3/library/functions.html
For循环:迭代元素,而不是索引
当编写一个for循环来迭代列表的元素时,建议直接迭代列表中的元素,而不是索引。
例如,而不是:
total = 0
for i in range(len(xs)):
total += xs[i]
你可以写:
total = 0
for x in xs:
total += x
在我看来,这更容易阅读。而且在选择索引的边界时,不太容易出现一比一的错误。
使用内置sum
计算和
使用内置函数sum
,您可以以更紧凑、更易读的方式重写两个函数:
from math import sqrt
def mean(xs):
return sum(xs) / len(xs)
def stddev(xs):
m = mean(xs)
var = sum(abs(x - m) for x in xs) / len(xs)
return sqrt(var)