簡體   English   中英

python后綴到Postfix(計算器)

[英]python infix to Postfix (calculator)

我有一個做計算器的作業(從后綴到后綴),我在運行此代碼時遇到語法錯誤( expr *時語法無效:*,我該如何解決此錯誤代碼?

順便說一句,我是一個新程序員,對專家來說,這個問題可能很簡單。如果您能盡快給出答案,我將非常高興。

class Op:
def __init__(self, num_in, num_out, fn):
    """
    A postfix operator

    num_in:     int
    num_out:    int
    fn:         accept num_in positional arguments,
                perform operation,
                return list containing num_out values
    """
    assert num_in  >= 0, "Operator cannot have negative number of arguments"
    self.num_in = num_in
    assert num_out >= 0, "Operator cannot return negative number of results"
    self.num_out = num_out
    self.fn = fn

def __call__(self, stack):
    """
    Run operator against stack (in-place)
    """
    args = stack.pop_n(self.num_in)         # pop num_in arguments
    res = self.fn(*args)                    # pass to function, get results
    stack.push_n(self.num_out, res)         # push num_out values back
ops = {
'*':  Op(2, 1, lambda a,b: [a*b]),          # multiplication
'/':  Op(2, 1, lambda a,b: [a//b]),         # integer division
'+':  Op(2, 1, lambda a,b: [a+b]),          # addition
'-':  Op(2, 1, lambda a,b: [a-b]),          # subtraction
'/%': Op(2, 2, lambda a,b: [a//b, a%b])     # divmod (example of 2-output op)

}

def postfix_eval(tokens):
"""
Evaluate a series of tokens as a postfix expression;
return the resulting stack
"""
if is_str(tokens):
    # if tokens is a string, treat it as a space-separated list of tokens
    tokens = tokens.split()

stack = Stack()
for token in tokens:
    try:
        # Convert to int and push on stack
        stack.append(int(token))
    except ValueError:
        try:
            # Not an int - must be an operator
            # Get the appropriate operator and run it against the stack
            op = ops[token]
            op(stack)         # runs Op.__call__(op, stack)
        except KeyError:
            # Not a valid operator either
            raise ValueError("unknown operator {}".format(token))
return stack

def main():
while True:
    expr = input(eval('\nEnter a postfix expression (or nothing to quit): ').strip()
    if expr:
        try:
            print("  => {}".format(postfix_eval(expr)))
        except ValueError as error:
            print("Your expression caused an error: {}".format(error))
    else:
        break

if __name__=="__main__":
main()

看看http://www.daniweb.com/software-development/python/threads/12326/how-to-do-input-in-python 如果你嘗試像

raw_input("Enter a postfix expression (or nothing to quit): ")

在您的主要功能中,它應該會更好地工作。

歡呼聲,彼得

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM