2010-08-31 75 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