问题描述:以最简单的统计问题为例,求解一组不定长数据的基本统计值,即平均值、标准差、中位数。
一组数据表示为S=s0, s1, …, sn-1,其算术平均值、标准差分别表示为:
由于平均数、标准差和中位数是三个不同的计算目标,使用函数方式编写计算程序。
- getNum()函数从用户输入获得数据;
- mean()函数计算平均值;
- dev()函数计算标准差;
- median()函数计算中位数
# text36.py
from math import sqrt
def getNum(): # 获取用户输入
nums = []
iNumStr = input("请输入数字(直接输入回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(直接输入回车退出): ")
return nums
def mean(numbers): # 计算平均值
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)
def dev(numbers, mean): # 计算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return sqrt(sdev / (len(numbers)-1))
def median(numbers): # 计算中位数
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med
n = getNum() # 主体函数
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n, m), median(n)))
程序先后调用getNum()、mean()、dev()和median()函数。利用函数的模块化设计能够复用代码并增加代码的可读性。每个函数内部都采用了简单的语句。
列表在实现基本数据统计时发挥了重要作用,表现在:
- 列表是一个动态长度的数据结构,可以根据需求增减少元素;
- 列表的一系列方法或操作符为计算提供了简单的元素运算手段;
- 列表提供了对每个元素的简单访问方式及所有元素的遍历方式。