Как сделать консольный калькулятор на Python?
я хочу сделать калькулятор на Python. Когда я смотрю в интернете как сделать калькулятор на python мне попадаются калькуляторы по типу введите первый, введите второй оператор. Как можно сделать так чтоб можно было просто написать 2 + 2 и получить ответ?
Ответы (6 шт):
Можно попробывать приравнивать к числовой переменной до того как выдаст исключение из-за + или - оператора, потом сохранить его в стринг переменную, а потом следующее число просто до конца сохранить в числовую переменную, а потом просто условие, если переменная стринг равняется + или минус, то мы выполняем операцию с result = num1 + num2. Как то так.
вот самый функциональный калькулятор:
print("результат: ", eval(input("Введите: ")))
но пользоваться им очень опасно
def f(inp):
res = []
n = 0
for i in range(len(inp)):
if inp[i] in ("+", "-", "*", "/"):
res.append(int(inp[n:i]))
res.append(inp[i])
n = i + 1
res.append(int(inp[i:]))
return res
данный код разделяет строку на части, к примеру 5 * 6 / 7 он превратит в [5, "*", 6, "/", 7]
Вот самый функциональный калькулятор:
import os
os.system("bc")
и пользоваться не опасно.
На верхнем уровне уровне работает read-eval-print loop (REPL).
read читает строку и разбивает её на токены - минимальные элементы имеющие самостоятельное значение. Простейший способ разбить на токены - регулярное выражение, которое выделит символы операций '+-*/()' и числа.
print печатает ответ.
eval по последовательности токенов вычисляет значение. Для вычисления используется алгоритм сортировочной станции.
shunting-yard algorithm - более подробное изложение, на английском.
Алгоритм сортировочной станции переводит обычную алгебраическую (её ещё называют инфиксной) запись в обратную польскую нотацию (постфиксную запись). Несколько примеров:
1 - 2 -> 1 2 -
1 - 2 * 3 -> 1 2 3 * -
(1 - 2) * 3 -> 1 2 - 3 *
Постфиксная запись обходится без скобок. Вычислить значение выражения в такой записи можно с помощью стековой машины. Для записи 1 2 3 * - последовательность действий будет такой:
токен стек комментарий
[] в начале стек пуст
1 [1] число 1 кладем в стек
2 [1 2] число 2 кладем в стек
3 [1 2 3] число 3 кладем в стек
* [1 6] выбираем из стека два числа и кладём назад их произведение
- [-5] выбираем из стека два числа и кладём назад их разность
На Java можно уложится в сотню строк. На Python думаю что пятидесяти хватит.
s,a,e = map(
str,
input().split()
)
a = a+"1"
s = int(s)
e = int(e)
if a == "+1":
print(s + e)
elif a == "*1":
print(s * e)
elif a == "%1":
print(s // e)
elif a == "-1":
print(s - e)
else:
pass