我的程序必须从用户那里取一个整数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)
它只显示List的编号,但之后会出错,无法打印其他三个元素(L,MO,sd)。
有什么问题?
答案 0 :(得分:0)
您的代码存在一些设计问题,导致您遇到错误。
您的函数接受参数(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'])
答案 1 :(得分:0)
问题是您分配给return
但未解包的results
语句。看看以下内容:
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允许您编写更简洁,更整洁的代码。