Функция возврата с функцией

Я хотел бы сделать что-то вроде следующего:

def getFunction(params): f= lambda x: do stuff with params and x return f 

Я получаю недопустимый синтаксис. Что такое Pythonic / правильный способ сделать это?

Таким образом, я могу вызывать f(x) не вызывая f(x,params) который является немного более грязным IMO.

Выражение lambda – очень ограниченный способ создания функции, вы не можете иметь несколько строк / выражений (в учебнике «Синтаксически ограничивается одним выражением» ). Однако вы можете встраивать стандартные функции def :

 def getFunction(params): def to_return(x): # do stuff with params and x return to_return 

Функции являются первоклассными объектами в Python, поэтому после определения вы можете передать to_return точно так же, как вы можете, с помощью функции, созданной с использованием lambda , и в любом случае они получают доступ к переменным «закрытия» (см. Например, почему не вложенные функции python называется закрытием? ).

Похоже, что вы на самом деле пытаетесь сделать это приложение с частичными функциями , для которого functools предоставляет решение. Например, если у вас есть функция multiply() :

 def multiply(a, b): return a * b 

… тогда вы можете создать функцию double() 1 с одним из аргументов, предварительно заполненных следующим образом:

 from functools import partial double = partial(multiply, 2) 

… который работает так, как ожидалось:

 >>> double(7) 14 

1 Технически partial объект, а не функция, но он ведет себя одинаково.

Вы не можете иметь многострочное выражение лямбда в Python, но вы можете вернуть лямбду или полную функцию:

 def get_function1(x): f = lambda y: x + y return f def get_function2(x): def f(y): return x + y return f