Я хочу рассчитать среднее и стандартное отклонение от ввода пользователем, но в нем говорится, что ошибка типа данных в функции отклонения

#python

Вопрос:

Я хочу создать программу, которая будет запрашивать ввод, пока не будет введена новая строка. Пользовательский ввод будет отображаться в списке. Затем он вычислит среднее и стандартное отклонение входных данных. Я написал следующий код, но он показывает некоторые ошибки типа данных для функции stddev.

 def main():
   print("Enter the data, one value per line.nEnd by entering empty line.")
   a = []
   prompt = ""
   line = input(prompt)

   while line:
       a.append(float(line))
       line = input(prompt)
   meanfunction(a)
   stdev(a)

   print("The mean of given data was: ",meanfunction(a))
   print("The standard deviation of given data was: ",stdev(a))
def meanfunction(data):
    average = sum(data) / len(data)
    average_f = "{:.2f}".format(average)
    return average_f

def variance(data):
    n = len(data)
    mean = sum(data) / n
    deviations = [(x - mean) ** 2 for x in data]
    variance = sum(deviations) / (n)
    variance_f = "{:.2f}".format(variance)
    return variance_f
 def stdev(data):
    import math
    var = variance(data)
    std_dev = math.sqrt(var)
    return std_dev
 if __name__ == "__main__":
       main()
 

Ответ №1:

Исправив отступ, проблема, по-видимому, заключается в вашей строке формата variance(data) непосредственно перед строкой возврата. Вы используете вывод variance в качестве входных данных в stdev функции, но variance возвращаете строковый вывод. Похоже meanfunction , он делает то же самое.

Как правило, для этих математических функций было бы лучше просто заставить их придерживаться того, что они должны делать: возвращать число, как вы уже делаете с stdev возвращением. Разберитесь с тем, чтобы сделать его красивым, когда дело доходит до фактической печати на экране.

Также неплохо сделать имена переменных более описательными, чем «a», особенно когда мы приходим посмотреть на наш старый код! Наконец, мы обычно хотим поставить импорт на самый верх.

 import math


def main():
    print("Enter the data, one value per line.n"
          "End by entering an empty line.")
    user_values = []
    prompt = ""
    line = input(prompt)

    while line:
        user_values.append(float(line))
        line = input(prompt)
    meanfunction(user_values)
    stdev(user_values)

    print(f"The mean of the given data was: {meanfunction(user_values):.2f} ")
    print(f"The standard deviation of the given data was:  {stdev(user_values):.2f}")


def meanfunction(data):
    average = sum(data) / len(data)
    return average


def variance(data):
    n = len(data)
    mean = sum(data) / n
    deviations = [(x - mean) ** 2 for x in data]
    variance = sum(deviations) / (n - 1)
    return variance


def stdev(data):
    var = variance(data)
    std_dev = math.sqrt(var)
    return std_dev


if __name__ == "__main__":
    main()
 

Комментарии:

1. Хорошие улучшения. Ему также не нужны те одинокие meanfunction и stdev звонки, которые ничему не назначены. (Кроме того, спрашивающий исправил их отступ.)