2010-08-31 47 views
3

我在Python中有两个输入,做一些操作,并返回两个输出的函数。我想重新排列输出参数,所以我写了周围的新输出顺序创建一个新的功能围绕lambda表达式的包装

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)

+1

既然你命名你的函数(即他们不是匿名的),我会避免使用'lambda'并使用'def'代替。 [Lambda表单](http://docs.python.org/tutorial/controlflow.html#lambda-forms)适用于小型*匿名*功能。 – 2010-09-01 00:25:42

回答

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为2-元组。

5

有问题的优先级。只需使用额外的括号:

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