Проверка входных данных Python с несколькими переменными... упрощена?

Во-первых, я много раз искал этот сайт и нашел другие посты на эту тему, даже то же самое задание, над которым я работаю, так что код очень похож... Однако есть несколько вещей, которые немного отличаются. Я беру этот курс, используя "Начиная с Python, 4-е издание", и мое задание из главы 5, "15. Средний балл и оценка". У меня есть код, написанный для всего, кроме проверки ввода, который мой инструктор настаивает на том, чтобы мы использовали его, хотя мы должны использовать только те методы кодирования, о которых говорилось в этой книге: никаких списков, кортежей, словарей, лямбда-выражений и т. Д. Что делает большинство примеров, которые я нашел в Интернете (и на этом сайте) для проверки входных данных бесполезными, так как я не могу понять их и не могу использовать их, если бы захотел. Я обратился к инструктору за помощью (онлайн-курс), но не получил никакого ответа в течение нескольких недель, поэтому я здесь. Предполагается, что программа попросит пользователя ввести 5 тестовых баллов, найти среднее значение баллов, назначить буквенный балл каждому баллу, а затем отобразить баллы с буквенным баллом, а также среднее значение. Я думал, что было бы проще проверить ввод, если бы я запросил оценки с помощью цикла "для оценки в диапазоне (1, 6)", но тогда я не знаю, как получить доступ к каждому вводимому пользователем результату для отправки. в функцию define_grade и позже для отображения в main (я не включил ни один из этого кода ниже)... Так что я закончил тем, что сделал переменную для каждой оценки, но затем я столкнулся с проблемой того, как проверить ввод (убедитесь, что введенная оценка не меньше 0 или больше 100 или что пользователь ввел число, а не букву) для каждой переменной. Я хотел бы иметь возможность записать некоторую обработку исключений в код, чтобы, если пользователь ввел букву вместо числа, исключение не выдается, потому что мой инструктор сказал: "Теперь моя работа - пытаться вывести из строя вашу программу ", хотя он не получил от меня ответа о том, как именно реализовать этот вид проверки ввода. Буду очень признателен за любую помощь, я боролся с этим уже несколько дней, и это серьезно меня напрягало.

РЕДАКТИРОВАТЬ: TypeError: input_validation() отсутствует 4 обязательных позиционных аргумента: "оценка2", "оценка3", "оценка4" и "оценка5" - это ошибка, которую я получаю, я знаю, что делаю что-то не так, однако я не Не знаю, что... Я чувствую, что есть более простой способ справиться с проверкой входных данных для нескольких переменных... Так как я все еще новичок в этом, я понятия не имею, как это реализовать.

def get_scores():

score1 = input_validation(float(input('Enter the score for the first test: ')))
score2 = input_validation(float(input('Enter the score for the second test: ')))
score3 = input_validation(float(input('Enter the score for the third test: ')))
score4 = input_validation(float(input('Enter the score for the fourth test: ')))
score5 = input_validation(float(input('Enter the score for the fifth test: ')))
return score1, score2, score3, score4, score5

def input_validation(score1, score2, score3, score4, score5):
while (score1, score2, score3, score4, score5) < 0 or (score1, score2, score3, score4, score5) > 100:
    print('Score cannot be less than 0 or greater than 100!')
    (score1, score2, score3, score4, score5) = float(input('Please enter a correct test score: '))
    return score1, score2, score3, score4, score5

1 ответ

Решение

Ваша немедленная ошибка в том, что вы определили input_validation() взять пять параметров, но вы передаете ему только один параметр при вызове.

Неловко собирать входные данные в одной функции и проверять входные данные в другой функции, потому что эти функции должны были бы быть очень тесно скоординированы, чтобы можно было перепроверять неверный ввод.

Также неудобно запрашивать несколько баллов одновременно, а затем проверять их все сразу, потому что, что вы делаете, если некоторые баллы действительны, а некоторые нет? Вы должны либо снова запросить все оценки, что напрасно тратит время пользователя, либо вам нужен способ перекомпоновки только для недействительных результатов, что является ненужной сложностью.

Возможно, будет лучшим вариантом обрабатывать только один балл за раз со всеми входными данными и проверкой в ​​одном месте:

def input_validation(prompt):
    # keep looping until they enter a good score
    while True:
        # get the answer as a string
        answer = input(prompt)
        try:
            # convert to float
            score = float(answer)
            # if in range, we're done!  return the converted score number
            if 0 <= score <= 100:
                return score
            # otherwise out of range, print an error message and keep looping
            else:
                print('Score cannot be less than 0 or greater than 100!')
        # if the answer wasn't a number, print an error message and keep looping
        except ValueError:
            print ('That is not a test score.')

Тогда вы можете назвать это так:

score1 = input_validation('Enter the score for the first test: ')
score2 = input_validation('Enter the score for the second test: ')

Если вы хотите сохранить результаты в списке вместо пяти отдельных переменных:

scores = []
for i in range(5):
    scores.append(input_validation('Enter the score for test number %d: ' % i+1))
Другие вопросы по тегам