Python 使用反向波兰符号构建具有x,y参数的函数

Python 使用反向波兰符号构建具有x,y参数的函数,python,function,parsing,rpn,Python,Function,Parsing,Rpn,我正试图从一个以反向波兰语表示法给出的输入构建一个python函数。我的函数应该能够接受x和y值作为参数,并返回相应x和y的函数值 例如,我的输入是: “x1+y3*+” 我的预期结果是一个函数对象,类似于: fun=lambda x,y:x+1+y*3 这样我就可以调用fun(1,2)并得到9 bin_ops = { "+": (lambda a, b: a + b), "-": (lambda a, b: a - b), &qu

我正试图从一个以反向波兰语表示法给出的输入构建一个python函数。我的函数应该能够接受
x
y
值作为参数,并返回相应
x
y
的函数值

例如,我的输入是:

“x1+y3*+”

我的预期结果是一个函数对象,类似于:

fun=lambda x,y:x+1+y*3

这样我就可以调用
fun(1,2)
并得到
9

bin_ops = {
    "+": (lambda a, b: a + b),
    "-": (lambda a, b: a - b),
    "*": (lambda a, b: a * b),
    "/": (lambda a, b: a / b),
}

def eval(expression):
    tokens = expression.split()
    stack = []

    for token in tokens:
        if token in bin_ops:
            arg2 = stack.pop()
            arg1 = stack.pop()

            result = bin_ops[token](arg1, arg2)
            stack.append(result)
        else:
            stack.append(float(token))

    return stack.pop()

txt = '2 1 + 2 3 * +'
print(eval(txt)) # prints 9.0
到目前为止,我可以在没有变量的情况下评估输入并给出结果

bin_ops = {
    "+": (lambda a, b: a + b),
    "-": (lambda a, b: a - b),
    "*": (lambda a, b: a * b),
    "/": (lambda a, b: a / b),
}

def eval(expression):
    tokens = expression.split()
    stack = []

    for token in tokens:
        if token in bin_ops:
            arg2 = stack.pop()
            arg1 = stack.pop()

            result = bin_ops[token](arg1, arg2)
            stack.append(result)
        else:
            stack.append(float(token))

    return stack.pop()

txt = '2 1 + 2 3 * +'
print(eval(txt)) # prints 9.0
你能帮助我如何构建函数而不是直接生成结果吗
以及如何正确处理变量(如
x
y
)。

您可以将解析代码从创建值更改为创建可使用关键字参数调用的函数,以进行最终计算:

bin_ops = {
    "+": lambda a, b: lambda **namespace: a(**namespace) + b(**namespace),
    "-": lambda a, b: lambda **namespace: a(**namespace) - b(**namespace),
    "*": lambda a, b: lambda **namespace: a(**namespace) * b(**namespace),
    "/": lambda a, b: lambda **namespace: a(**namespace) / b(**namespace),
}

def eval(expression):
    tokens = expression.split()
    stack = []

    for token in tokens:
        if token in bin_ops:
            arg2 = stack.pop()
            arg1 = stack.pop()

            result = bin_ops[token](arg1, arg2)
            stack.append(result)
        else:
            try:
                num = float(token)
            except ValueError:
                stack.append(lambda *, _token=token, **namespace: namespace[_token])
            else:
                stack.append(lambda *, _num=num, **namespace: _num)

    return stack.pop()

txt = "x 1 + y 3 * +"
fun = eval(txt)
print(fun(x=2, y=4)) # prints 15.0

Python作用域的工作方式使得生成使用循环变量的函数有点棘手。这就是为什么我使用
token
num
为生成的
lambda
函数中的参数设置默认值,而不是直接使用它们的名称。如果您刚刚执行了
lambda**namespace:namespace[token]
,您会发现
token
在循环继续运行时改变了值。
bin_ops
代码没有这个问题,因为最终函数已经嵌套在一个额外的作用域中,因为
lambda,b
函数是我们构建内部
lambda
s的地方。

感谢您的回答和解释!我(需要)使用Python2解决我的问题,所以我得到一个错误:“Python2不支持单星参数”,你知道解决这个问题的方法吗?啊,你可以通过删除最后两个
lambda
函数中的
*,
部分来避免这个错误。但我也会考虑升级您的Python版本,Python 2不再受上游支持。您事先知道参数变量的名称吗?或者你需要从RPN中挑选出来吗?我早就知道了