Как записать функции IF в Python, когда условие требует, чтобы ввод был специальным символом? - PullRequest
2 голосов
/ 29 марта 2020

Я пытаюсь построить образец калькулятора в Python. Ожидаемый результат для calculate(2, 3, -) должен быть -1.

Однако мне сложно определить оператора.

if operator == +: вернет синтаксическую ошибку, но когда я сделаю if operator == '+':, мне нужно написать что-то вроде calcuate(3, 4, '+') для работы.

Вот

def calculate(x, y, operator):
    if operator == '+':
        print (x + y)
    elif operator == '-':
        print (x - y)
    elif operator == '*':
        print (x * y)
    elif operator == '/':
        print (x / y)

Могу ли я избавиться от необходимых апострофов?

1 Ответ

2 голосов
/ 29 марта 2020
As the comments indicate you can not simply pass +, -, div.

Другой вариант, который упростил бы ваш код, - это использовать операторский модуль

Рефакторинг кода с использованием операторского модуля

# We obtain operators we will use from operator module
from operator import add, sub, mul, pow
from operator import truediv as div

def calculator(x, y, op):
  " Calculator applies the passed-in operator to arguments "
  return op(x, y)

# Tests
print(calculator(5, 3, add))
print(calculator(5, 3, sub))
print(calculator(5, 3, mul))
print(calculator(5, 3, div))
print(calculator(5, 3, pow))

Использование исходного ввода строки

Как подсказывает @JLPeyret, операторы упрощают использование словаря для логики c, для которой выбирается операция.

def calculator(x, y, op):
      " Calculator applies the passed-in operator to arguments "
    d = {'+', add,
         '-', sub,
         '*', mul,
         '/', div,
         '**', pow}
      return d[op](x, y)

# Tests
print(calculator(5, 3, '+'))
print(calculator(5, 3, '-'))
print(calculator(5, 3, '*'))
print(calculator(5, 3, '/'))
print(calculator(5, 3, '**'))

Выходы в обоих случаях

8
2
15
1.6666666666666667
125
...