Как я могу проверить, является ли то, что я ввожу в свой текстовый калькулятор, числом? - PullRequest
0 голосов
/ 05 августа 2020

Когда я предлагаю консоли попросить пользователя ввести число для калькулятора, я хочу проверить, является ли вводимый пользователем числом числом. В first_input () я использовал условие if else, чтобы проверить, было ли введенное пользователем число числом. Хотя, если false, функция вызывается снова, чтобы предложить пользователю ввести число, она не возвращает ни одного раза, когда я пытаюсь вычислить его на своем калькуляторе, почему это так и как я могу правильно вернуть число после того, как пользователь не может ввести число?

# Operations variable
oper = "+-*/"

# Calculates basic operations
def calc(x, op, y):
    for i in oper:
        if i == str(op):
            return eval(str(x) + op + str(y))

# Main function that controls the text-based calculator
def console_calculator():
    def first_input():
        x = input('Type your first number: ')
        if x.isnumeric():
            return x
        else:
            print('Please type in a number')
            first_input()

    def operation_input():
        operat = input('Type one of the following, "+ - * /": ')
        return operat 

    def next_input():
        y = input('Type your next number: ')
        return y

    answer = calc(first_input(), operation_input(), next_input())
    print(answer)

console_calculator()

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Я бы предложил блок try / except. Таким образом, он вернет само целое число, тем более что вы уже превращаете их в строки в блоке eval.

x = input('Type your first number: ')
try:
    return int(x)
except ValueError:
    print('Please type in a number')
    ...

Также, чтобы продолжать запрашивать у пользователя целое число, пока они не введут правильное значение, я бы использовать время l oop.

0 голосов
/ 05 августа 2020

На самом деле вы скрыли ответ в собственном вопросе:

как мне правильно вернуть номер

Вы забыли return в своей ветке else:

# Calculates basic operations
def calc(x, op, y):
    for i in op:
        if i == str(op):
            return eval(str(x) + op + str(y))

# Main function that controls the text-based calculator
def console_calculator():
    def first_input():
        x = input('Type your first number: ')
        if x.isnumeric():
            return x
        else:
            print('Please type in a number')
            return first_input() # missing return

    def operation_input():
        operat = input('Type one of the following, "+ - * /": ')
        return operat 

    def next_input():
        y = input('Type your next number: ')
        return y

    answer = calc(first_input(), operation_input(), next_input())
    print(answer)

console_calculator()

Но у вас также есть ошибка компиляции, потому что вы ссылаетесь на oper, но параметр называется op.

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

0 голосов
/ 05 августа 2020

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

def console_calculator():
    def user_input():
        x = input('Type your number: ')
        if x.isnumeric():
            return x
        else:
            print('Please type in a number')
            return user_input()

    def operation_input():
        operat = input('Type one of the following, "+ - * /": ')
        return operat 


    answer = calc(user_input(), operation_input(), user_input())
    print(answer)
...