Как использовать одну попытку / блок для функции множественного ввода для проверки целочисленных значений в python? - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в python и пытаюсь написать небольшой код для ипотечного калькулятора. Я использую три переменные, а именно интереса, no_of_month и Principal_amt, и его значение берется с помощью функции ввода.

Ниже приведен код для того же.

#######################
while True:
    try:
        no_of_month = int(input('Enter no of months you want for payment: '))
    except ValueError: 
        print('The value you entered is not integer')
        continue
    else:
        break
##############################
while True:
    try:
        interest = int(input('Enter interest you want for the loan: '))
    except ValueError:
        print('The value you entered is not integer')
        continue
    else:
        break
    ################################    
while True:
    try:
        principal_amt = int(input('Enter principal amount you want as loan:'))
    except ValueError:
        print('The value you entered is not integer')
        continue
    else:
        break

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

Есть ли способ определить функцию и вызвать ее с надлежащей проверкой на месте?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Вы можете определить функцию, которая позаботится о процессе проверки для вас.
Пример:

def get_input(question):
    """Read user input until it's not an integer and return it."""
    while True:
        try:
            return int(input(question))
        except ValueError: 
            print('The value you entered is not integer')


no_of_month = get_input('Enter no of months you want for payment: ')
interest = get_input('Enter interest you want for the loan: ')
principal_amt = get_input('Enter principal amount you want as loan:')
0 голосов
/ 20 апреля 2020

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

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

no_of_months = get_int("Enter no of months you want for payment: ")
interest = get_int("Enter interest you want for the loan: ")
principal_amount = get_int("Enter principal amount you want as loan: ")

Затем вы размещаете все сложные логи c (печать приглашения, получение значения, проверка на наличие ошибок и повторная попытка при необходимости) внутри этой функции get_int(), чтобы она вообще не загрязняла ваш основной код. В качестве примера, вот минималистская функция, которая делает то, что вы хотите:

def get_int(prompt):
    while True:
        try:
            input_val = input(prompt)
            return int(input_val)
        except ValueError:
            print(f"The value '{input_val}' is not a valid integer.\n")

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

Рассмотрим, например, случай, когда вы хотите убедиться, что введенные значения находятся в указанном диапазоне, например, если вы решите, что кредиты должны быть от одного месяца до трех лет включительно, или процентная ставка должна быть больше 3%. Для этого просто измените на get_int():

def get_int(prompt, min_val = None, max_val = None):
    while True:
        # Get input, handle case where non-integer supplied.

        try:
            input_val = input(prompt)
            value = int(input_val)
        except ValueError:
            print(f"The value '{input_val}' is not a valid integer.\n")
            continue

        # If min or max supplied, use that for extra checks.

        if min_val is not None and min_val > value:
            print(f"The value {value} is too low (< {min_val}).\n")
            continue

        if max_val is not None and max_val < value:
            print(f"The value {value} is too high (> {max_val}).\n")
            continue

        # All checks passed, return the value.

        return value

no_of_months = get_int("Enter no of months you want for payment: ", 1, 36)
interest = get_int("Enter interest you want for the loan: ", 3)
principal_amount = get_int("Enter principal amount you want as loan: ")

Из последней строки вы можете видеть, что старые параметры по-прежнему работают нормально, но из предыдущих двух строк вы знаете, что можете укажите диапазон допустимых значений.

...