Как добавить отдельную функцию для расчета среднего? - PullRequest
0 голосов
/ 27 апреля 2020

Я застрял на этой проблеме. Код у меня пока работает, но мой профессор хочет увидеть некоторые изменения. Мне нужно добавить обработку ошибок, и мне нужна отдельная функция для вычисления среднего, которую я буду вызывать в main. Вот то, что я до сих пор ...

import os

def process_file(filename):
    f = open(filename,'r')
    lines = f.readlines()[1:]
    f.close()

    scores = []

    for line in lines:
        parsed = line.split(",")
        count = int(parsed[1])
        scores.append(count)

    calculate_result(scores)

def calculate_result(scores):
    print("High: ", max(scores))
    print("Low: ", min(scores))
    print("Average: ", sum(scores)/len(scores))


def main():
    filename = "scores.text"
    if os.path.isfile(filename):
        process_file(filename)
    else:
        print ("File does not exist")
        return 0


main()

1 Ответ

0 голосов
/ 28 апреля 2020

Полагаю, есть 2 части:

Мне нужно добавить обработку ошибок

и

Мне нужна отдельная функция для вычисление среднего значения, которое я назову в основном

Во второй части, я думаю, вам не нужна помощь. Но обработка ошибок - это своего рода искусство, поэтому я понимаю, где вы можете застрять в этом. Вот несколько советов, которые помогут вам начать работу.

Наиболее распространенный тип обработки ошибок связан с обработкой ввода. Думая более широко, мы можем расширить это до всего, что пересекает границу пространства памяти программ . Это включает не только пользовательский ввод, но и вывод; взаимодействие с файловой системой; использование сетевых интерфейсов (или любого устройства связи или аппаратного интерфейса); запуск / остановка или иное взаимодействие с другими программами; позвонить в библиотеку, которая делает что-либо из этого от нашего имени; и многое другое ....

Итак, какие части вашей программы взаимодействуют с «внешним»? Я вижу несколько:

  1. в main() программа делает предположение о существовании файла. Вы уже проверяете, чтобы убедиться, что этот файл существует, и возвращаете 0, если это не так (вы можете изменить его на ненулевое значение, так как 0 обычно используется, чтобы сигнализировать об отсутствии ошибок)
  2. process_file() делает это: f = open(filename,'r') но вы уверены, что это будет работать? Есть ли условия, когда это может потерпеть неудачу?
    • Что если пользователь, который запускает программу, не имеет прав на чтение этого файла?
    • Что если файл был удален или изменен в промежутке между проверкой в ​​main и последующий open вызов в process_file? Это состояние гонки TOCTOU , и каждый разработчик программного обеспечения должен следить за этим.
  3. Вероятно, самый очевидный источник потенциальных ошибок для этой программы это содержимое входного файла:
    • Мы предполагаем, что входные данные разделены запятыми. Что, если пользователь использует вкладки или какой-либо другой символ?
    • При обработке строк вы получаете: count = int(parsed[1]), но как узнать, что parsed[1] можно привести к int?
    • Что произойдет, если файл существует, но пуст (подсказка: len(scores)==0)? Всегда смотрите на эти крайние случаи.

Наконец, похоже, что вы используете операторы if-then для проверки ошибок. Это хорошо, но еще одним мощным инструментом для устранения ошибок являются операторы try-except. Они не являются взаимоисключающими: иногда проще использовать оператор if, а иногда лучше ловить исключение с помощью try-except. Некоторые из ошибок, с которыми вам придется иметь дело, легче устранить, если использовать один подход поверх другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...