@lera5555

Почему выводится ошибка ValueError на строке 10: I/O operation on closed file? Может с отступами что не так?

from math import sqrt
el = -1
k = s = sr = ch = 0
while el != 0:
      el = int(input())
      s += el
      k += 1
sr = s / k    
for i in range(1, k + 1):
       el = int(input())
       ch += (el - sr) ** 2
print(sqrt(ch / k - 1))
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Дай угадаю.
1. Ты рассчитываешь стандартное отклонение последовательности.
2. Последовательность заканчивается нулём.
3. Ты это делаешь в рамках какой-то олимпиады или конкурса, где код выполняется в тестовом окружении (песочнице) с фиксированным вводом.

Тестовое окружение подаёт на стандартный ввод твоей программы элементы последовательности. Твоя программа поглощает эти элементы вызовами input() в рамках первого цикла while.
Подав всю последовательность, тестовое окружение, очевидно, закрывает стандартный ввод.
Но ты СНОВА обращаешься к стандартному вводу (input()) в рамках цикла for! Поскольку ввод уже закрыт, генерируется исключение IOError.

Что делать?
Вариант 1. Сохраняй элементы в коллекцию, например в список, и итерируйся по списку для расчёта среднего и дисперсии. Может провалиться, если есть ограничение на потребление памяти при очень длинной последовательности на вводе.
Вариант 2. Гугли one-pass dispersion calculation (однопроходный расчёт дисперсии). Есть формулы для расчёты среднего и дисперсии, которые позволяют их считать, не храня последовательность целиком, а только читая каждый элемент по мере его поступления.
Зная дисперсию, найти стандартное отклонение тривиально.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы