围绕Lambda表达式的包装器

3 投票
2 回答
975 浏览
提问于 2025-04-16 03:33

我在Python里有一些函数,它们需要两个输入,经过一些处理后会返回两个输出。我想要调整输出的顺序,所以我写了一个包装函数,目的是在原来的函数外面再包一层,创建一个新的函数来改变输出的顺序。

def rotate(f):
    h = lambda x,y: -f(x,y)[1], f(x,y)[0]
    return h

f = lambda x, y: (-y, x)
h = rotate(f)

但是,这样做却出现了错误信息:

NameError: global name 'x' is not defined

x是一个lambda表达式的参数,那为什么它必须被定义呢?

我期望的结果是,h应该是一个新的函数,它的功能和lambda x,y: (-x,-y)是完全一样的。

2 个回答

5

这里有个优先级的问题。只需要加上额外的括号就可以了:

def rotate(f):
    h = lambda x,y: (-f(x,y)[1], f(x,y)[0])
    return h
7

你需要在这个 lambda 表达式周围加上括号:

h = lambda x,y: (-f(x,y)[1], f(x,y)[0])

否则,Python 会把代码理解成:

h = (lambda x,y: -f(x,y)[1]), f(x,y)[0]

而且 h 是一个包含两个元素的元组。

撰写回答