使用函数连接程序的变量

时间:2017-11-13 08:51:04

标签: python

我的程序必须从用户那里取一个整数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)。

有什么问题?

2 个答案:

答案 0 :(得分:0)

您的代码存在一些设计问题,导致您遇到错误。

  1. 您的函数接受参数(calculation),但不对其执行任何操作。相反,它依赖N作为全局变量。这通常被认为是一种糟糕的设计。

  2. 您的函数返回一个元组,但您的调用代码不会对其执行任何操作。相反,它会尝试访问在函数内创建的导致NameError的局部变量。

  3. 作为一个修复,我建议将信息正确地传递给函数,函数应该返回一个字典而不是一个元组(这样可以更清楚地访问返回的值,而不是记住索引)。

    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允许您编写更简洁,更整洁的代码。