我的程序必须从用户那里获取整数N(例如5(,创建一个从1到20的N个整数随机数列表(例如[1,15,12,19,5](,并使用函数计算这些数字的平均值和标准偏差。到目前为止,我的程序是:
import random
import math
def stats(calculation):
'''
[9,20,15,9,11,19,2,4,16,8] -> MO = 11.30, SD = 6.07
'''
L=[]
total = 0
mathsum = 0
for i in range(0,N,1):
x=random.randint(1,20)
L.append(x)
for num in L:
total += num
MO = (total)/N
for i in range(0,N,1):
mathsum +=(L[i]-MO)**2
sd = math.sqrt((1/(N-1))*mathsum)
return N, L, '{:2.2f}'.format(MO), '{:2.2f}'.format(sd)
N=int(input('Give integer: '))
results = stats(N)
print('Number of integers: ', N)
print('List: ',L)
print('Average: ', MO, end='t')
print('Standard deviation: ', sd)
它只显示列表的编号,但之后它给出错误,无法打印其他三个元素(L、MO、sd(。
问题出在哪里?
问题是您分配给results
但没有解压缩的return
语句。请看以下内容:
import random
import math
def stats(size):
'''
[9,20,15,9,11,19,2,4,16,8] -> MO = 11.30, SD = 6.07
'''
L=[random.randint(1,20) for _ in range(size)]
total = sum(L)
MO = total / size
mathsum = sum((x-MO)**2 for x in L)
sd = math.sqrt((1/(size-1))*mathsum)
return L, '{:2.2f}'.format(MO), '{:2.2f}'.format(sd)
N=int(input('Give integer: '))
results = stats(N)
print('Number of integers: ', N)
print('List: ', results[0])
print('Average: ', results[1], end='t')
print('Standard deviation: ', results[2])
请注意,函数内部定义的变量不能由外部作用域访问。反之亦然,但不建议使用(globals
函数中使用(。由于您返回的值超过 1 个,因此results
成为您可以索引以获取内容tuple
。
撇开错误不谈,你的代码逻辑是合理的,但太冗长了。Python允许你编写更短,更整洁的代码。
您的代码存在一些设计问题,导致您遇到错误。
-
你的函数接受一个参数(
calculation
(,但不对它做任何事情。相反,它依赖于N
是一个全局变量。这通常被认为是一个糟糕的设计。 -
您的函数返回一个元组,但您的调用代码不会对它执行任何操作。相反,它尝试访问在函数中创建的局部变量,从而导致
NameError
。
作为修复,我建议将信息正确传递给函数,并且该函数应返回字典而不是元组(这将允许更清晰地访问返回的值而不是记住索引(。
def stats(n):
'''
[9,20,15,9,11,19,2,4,16,8] -> MO = 11.30, SD = 6.07
'''
L = []
total = 0
mathsum = 0
for i in range(0, n, 1):
x = random.randint(1, 20)
L.append(x)
for num in L:
total += num
MO = total / n
for i in range(0, n):
mathsum += (L[i] - MO) ** 2
sd = math.sqrt((1 / (n - 1)) * mathsum)
return {'n': n,
'numbers': L,
'average': '{:2.2f}'.format(MO),
'sd': '{:2.2f}'.format(sd)}
n = int(input('Give integer: '))
results = stats(n)
print('Number of integers: ', results['n'])
print('List: ', results['numbers'])
print('Average: ', results['average'], end='t')
print('Standard deviation: ', results['sd'])