2015-02-04 2 views
3

Я хотел бы сделать что-то вроде следующего:Возврат функции с функцией

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

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

Этот способ я могу позвонить f(x) без необходимости звонить f(x,params), который является немного более грязным ИМО.

ответ

5

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

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

функции являются объектами первого класса в Python, так что однажды определил вы можете передать to_return вокруг точно, как вы можете с помощью функции, созданные с помощью lambda, и в любом случае они получают доступ к переменным «замыкания» (см., например, Why aren't python nested functions called closures?).

+1

Ключевым моментом является функция 'def''d - это просто первоклассное значение, такое как результат лямбда, с тем же доступом« закрытия ». – user2864740

1

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

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

def get_function2(x): 
    def f(y): 
     return x + y 
    return f 
4

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

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

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

from functools import partial 

double = partial(multiply, 2) 

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

>>> double(7) 
14 

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

+0

Прохладный. Можете ли вы прокомментировать, когда эта библиотека использовала бы решение, подобное johnrsharpe, выше? – user3391229

+1

@ user3391229 Если вы хотите частичную функцию (как указано выше), используйте 'partial()' - она ​​менее подробная, и вы вряд ли допустите ошибку. Если вам нужно что-то более сложное, используйте закрытие, как в ответе Джона Шарпа. Это пример общего правила в Python - если включенные батареи решают вашу проблему, используйте их. –

+0

отлично. Спасибо – user3391229

Смежные вопросы