围绕Lambda表达式的包装器
我在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
是一个包含两个元素的元组。