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

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

EDIT: TypeError: input_validation () отсутствует 4 обязательных позиционных аргумента: 'score2', 'score3', 'score4' и 'score5' - ошибка, которую я получаю, я знаю, что я делаю что-то неправильно, «Я знаю, что ... Я чувствую, что есть простой способ справиться с проверкой входных данных для нескольких переменных. Поскольку я по-прежнему новичок в этом, я понятия не имею, как его реализовать.

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))

Есть идеи?

10000