Есть ли способ извлечь элементы из списка, возвращаемого функцией, а затем использовать эти элементы в следующей функции?

#python

Вопрос:

Я пытаюсь создать калькулятор RPN, который учитывает

 3
3
*
4
4
*
 
=
 

и возвращает результат после = ввода. До сих пор мне удавалось заставить его работать для отдельных выражений, т. Е.

 3
3
*
=
 

и

 4
4
*
=
 

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

Я многое изменил, но текущая версия, которая у меня есть, выглядит так:

 def user_inputs():
    print("in inputs func:")
    operators = {' ', '-', '*', '/', '%', '='}
    inputs = [0]
    print("initial inputs: ", inputs)  

while True:
        blank = input()
        if blank == '=':
            inputs.append(blank)
            return inputs
        elif blank not in operators: #if integer
            inputs.append(int(blank))
            print("inputs: ", inputs)
        elif blank in operators: #if operator
            inputs.append(blank)
            print("op inputs: ", inputs)

            checking = inputs[-3:]
            print("checking: ", checking)
            if type(checking[0]) is int and type(checking[1]) is int and checking[2] in operators:
                return inputs
        else:
            print("Unrecognised operator or operand ", blank)
            continue


def calculation(inputs):
    inputs = inputs()
    stack = []

    for a in inputs:
        stack.append(a)
        continue

    checking = stack[-3:]
    operators = {' ', '-', '*', '/', '%', '='}
    if type(checking[0]) is int and type(checking[1]) is int and checking[2] in operators:
        stack.pop()


    op2, op1 = stack[-1], stack[-2]
    print("op1 and op2: ", op1, op2)

    if ' ' in inputs:    #code for addition
        result = op1   op2
        stack.append(result)
                                         #user_inputs() position 1


    elif '-' in inputs: #code for subtraction
        result = op1 - op2
        stack.append(result)

    elif '/' in inputs: #code for division
        if op2 == 0: #if division by 0 is attempted
            print("Divide by 0.")
            exit()#see how to leave the function so that it doesnt crash
        else:
            result = int(op1 / op2)
            stack.append(result)

    elif '*' in inputs: #code for multiplication
        result = op1 * op2
        stack.append(result)

    elif '%' in inputs:
        if op2 == 0:
            print("Divide by 0.")
            exit()
        else:
            result = op1 % op2
            stack.append(result)


    if stack[-1] >= 2147483647:  # if above limit
        return 2147483647
    elif stack[-1] <= -2147483648: # if below limit
        return -2147483648
    else:
        return stack[-1]
                                                    #user_inputs() position 2


while True: 
    print("nRESULT:", calculation(user_inputs), "n")
 

Я искал способы сделать это, но не нашел ничего, что я понимаю в использовании. Я подумывал позвонить user_input() внутрь calculation() , но потом не знаю, где бы это можно было разместить. Когда я попытался вызвать его в позиции 1, он позволил мне ввести вторую часть выражения, но не стал возвращаться и выполнять вычисления. Может быть, это из-за того, куда я его положил? Но я все еще даже не уверен, что этот подход верен/когда-либо сможет сделать то, что я хочу.
Есть ли способ снова получить входные данные и каким-то образом вернуться calculation() в точку, где можно было бы выполнить любой из математических операторов?

Комментарии:

1. Во-первых, вы смотрите на верхнюю часть стека, чтобы определить, есть ли там оператор, а затем выбрасываете его. Вам нужно использовать этот оператор, чтобы знать, что делать с op1 и op2. Повторное сканирование входных данных вам не поможет, так как вы можете получить другого оператора.

2. Для RPN оператору никогда не нужно входить в стек. Числовые входные данные поступают в стек; ввод оператора-это сигнал для удаления соответствующего количества элементов из стека, применения к ним оператора, который вы только что прочитали, а затем помещаете результат в стек. Это = всего лишь сигнал для прекращения считывания входных данных и сообщения о верхней части стека в качестве конечного результата.

3. @chepner, теперь проблема в том, что структура кода такова, что он должен переходить от входных данных к вычислению и обратно к входным данным.

4. Я попробовал from_calc.append(add ()), где add-это функция, которая добавляет, а from_calc-это место, где будут храниться результаты, но она не работает