Как проверить операторы с целыми числами для программы калькулятора?

Я пытаюсь создать программу, которая позволяет пользователю вводить один из 4 операторов (сложение, вычитание, умножение или деление), а затем два числа. Затем программа рассчитывает операцию. Однако я не могу проверить операторы для вывода. Я сейчас пытаюсь с оператором if ... else, но безуспешно. Здесь есть указатели?

operator = ""
numbers = []
inputNumbers = ["first number", "second number"]

def userInput():
    try:
        operator = input("Please choose a valid operation (+, -, *, /): ")
    except:
        print("Please enter a valid operator.")
    for inputNumber in inputNumbers:
        user_num_input = -1
        while user_num_input < 0:
            try:
                user_num_input = int(input("Type in {}: ".format(inputNumber)))
            except:
                user_num_input = -1
                print("Please enter a whole number.")
            if user_num_input > -1:
                numbers.append(user_num_input)
userInput()

def addNumbers():
    add = numbers[0] + numbers[1]
    return add(numbers)

def subNumbers():
    sub = numbers[0] - numbers[1]
    return sub(numbers)

def mulNumbers():
    mul = numbers[0] * numbers[1]
    return mul(numbers)

def divNumbers():
    div = numbers[0] / numbers[1]
    return div(numbers)

def userOutput():
    if operator == "+":
        print(numbers[0], "+", numbers[1], " = ", addNumbers())
    elif operator == "-":
        print(numbers[0], "-", numbers[1], " = ", subNumbers())
    elif operator == "*":
        print(numbers[0], "*", numbers[1], " = ", mulNumbers())
    elif operator == "/":
        print(numbers[0], "/", numbers[1], " = ", divNumbers())
userOutput()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
453
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы должны проверить, правильно ли введена пользователем операция, tryexcept здесь работать не будет, так как input() не выдаст никаких ошибок. Также вот более элегантный способ получить от пользователя 2 действительных целых числа и вычислить окончательное уравнение (используя eval())

inputNumbers = ["first number", "second number"]
operations = ['+', '-', '*', '/']

numbers = []
operator = ''

while not operator:
    operator = input('Please choose a valid operation (+, -, *, /): ')
    if operator not in operations:
        print("Please enter a valid operator.")

while len(numbers) < len(inputNumbers):
    try:
        numbers.append(int(input("Type in {}: ".format(inputNumbers[len(numbers)]))))
    except:
        print("Please enter a whole number.")

result = eval(operator.join(map(str, numbers)))
print('{} {} {} = {}'.format(numbers[0], operator, numbers[1], result))

Вывод:

Please choose a valid operation (+, -, *, /): addition
Please enter a valid operator.
Please choose a valid operation (+, -, *, /): /
Type in first number: 123.321
Please enter a whole number.
Type in first number: 10 
Type in second number: hundred
Please enter a whole number.
Type in second number: 100
10 / 100 = 0.1

Я бы не стал использовать eval для такой рутинной задачи, тем более, когда вы оцениваете ввод пользователя, так что это не рекомендуется. Кроме того, у нас есть готовый к использованию модуль operator, как в моем ответе: stackoverflow.com/a/53686331/10642035

Luan Naufal 08.12.2018 20:51

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

Filip Młynarski 08.12.2018 20:53

Элегантный, конечно, выглядит лучше. Проблема с использованием eval () - это риск, который мы должны знать, что в процессе производства некоторый вредоносный код может быть введен с использованием этого поля input. Не то чтобы бояться в контексте этой проблемы, но кое-что определенно важно упомянуть.

Luan Naufal 08.12.2018 21:01

@ FilipMłynarski, вы действительно думаете, что это решение более элегантно, чем другие со встроенным модулем?

Attila Bognár 08.12.2018 21:01

Вы должны использовать встроенный operatorмодуль Python. Тогда вы можете использовать такой диктант:

import operator

operator_dict = {"+": operator.add, 
                 "-": operator.sub, 
                 "*": operator.mul,
                 "/": operator.truediv}
user_input = input("Please choose a valid operation (+, -, *, /): ")
operator_func = operator_dict.get(user_input, None)
# if operator_func is not None then the input was correct!
if operator_func is not None:
    ... get the numbers ...
    print("{}{}{} = {}".format(num1, user_input, num2, operator_func(num1, num2))

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

Самый простой и чистый способ сделать это - использовать модуль operator в Python, поэтому ваш метод userOutput будет выглядеть следующим образом. Однако несколько изменений, которые вы должны сделать в своем коде, - это переименовать переменную operator часа в op, поскольку это будет конфликтовать с именем модуля python, и обновить operator в качестве возврата из userInput():

import operator
op = ""
numbers = []
inputNumbers = ["first number", "second number"]
operators = {
        '+' : operator.add,
        '-' : operator.sub,
        '*' : operator.mul,
        '/' : operator.truediv,
        '%' : operator.mod,
        '^' : operator.xor,
}

def userInput(op):
    while not op:
        op = input("Please choose a valid operation (+, -, *, /): ")
        if op not in operators:
            print("Please enter a valid operator.")
            op = ""
    for inputNumber in inputNumbers:
        user_num_input = -1
        while user_num_input < 0:
            try:
                user_num_input = int(input("Type in {}: ".format(inputNumber)))
            except:
                user_num_input = -1
                print("Please enter a whole number.")
            if user_num_input > -1:
                numbers.append(user_num_input)
    return op

def userOutput(op, operators):
    result = operators[op](numbers[0], numbers[1])
    print("{} {} {} = {}". format(numbers[0], op, numbers[1], result))

op = userInput(op)
userOutput(op, operators)

Вы используете модуль operator в качестве ключа, и ваша функция не имеет аргументов для передачи пользовательского ввода!

Attila Bognár 08.12.2018 20:52

Вы правы, @ AttilaBognár, обновленный полным кодом, теперь учитывает все аспекты правильной работы

Luan Naufal 08.12.2018 20:58

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

Attila Bognár 08.12.2018 21:11

@ AttilaBognár, первая часть кода была именно той, которую написал @KyleBarnes. Поскольку проблема заключалась в том, чтобы иметь дело с оператором, это было единственное, над чем я работал. В любом случае обновите первую часть, вынув try / except для правильной работы, пока не будет введен действительный operator.

Luan Naufal 08.12.2018 22:04

Другие вопросы по теме