2010-08-31 2 views
3

У меня есть функции в 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 является аргументом для выражения лямбда, так почему же его нужно определить?

Ожидаемое поведение является то, что h должна быть новая функция, которая идентична lambda x,y: (-x,-y)

+1

Поскольку вы называете свои функции (то есть они не анонимны), я бы избегал использования 'lambda' и вместо этого использовал' def'. [Лямбда-формы] (http://docs.python.org/tutorial/controlflow.html#lambda-forms) предназначены для небольших * анонимных * функций. –

ответ

7

Вам нужно добавить в круглые скобки лямбда-выражения:

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 
Смежные вопросы