Мой совет: сделай каждую команду отдельной функцей вида:
# ': str' - это type hint. На выполнение не влияет, оно в первую очередь для читаемости. Можешь пока пропустить.
def command_plus(args: str): # функция получает аргумент как строку, вместо вызова input().
"Складывает указанные числа." # doc-string содержит человекочитаемое описание функции
print("Калькулятор на сложение")
parts = [int(part) for part in args.split()] # операции со строками, list comprehensions
if not parts: # какие значения в питоне истинные (truey), какие ложные (falsy)?
parts.append(int(input("1-е число: ")))
parts.append(int(input("2-е число: ")))
res = sum(parts)
print(f"Результат: {res}") # f-строки
Далее, научись работать со словарями:
# словарь, содержащий имя команды и её функцию
commands = {
'calc +': command_plus,
# тут будут другие команды
}
Тогда рабочий цикл будет примерно таким:
while True:
cmd = input('Введите команду: ') # например, "calc + 2 3 5"
for cmd_name, cmd_func in commands.items(): # цикл for, операции со словарями
if cmd.startswith(cmd_name): # операции со строками
cmd = cmd[len(cmd_name):] # срезы (slice)
try: # обработка исключений
cmd_func(cmd)
except Exception as err:
print(f"Произошла ошибка: {err}")
break # операторы передачи управления
else: # Как работает оператор else: совместно с циклами?
if cmd == 'exit':
print('До свиданья')
break # прерываем while
else:
print(f"Неизвестная команда: {cmd}")
Будет куда проще читать код и расширять функциональность.
Ну и почитай по темам, которые я упомянул в комментариях.