2015-10-29 4 views
2

Возможно ли создать функцию, которая принимает лямбда-функции в качестве аргументов (с каждой лямбда-функцией с использованием аргумента x), а затем возвращает новую функцию, которая имеет один аргумент x и возвращает продукт всех лямбда-функций?Функция, возвращающая функцию (в python)

Вот мой нерабочим пример:

def func_you(lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4): 
    return def func_you_2(x): 
     return lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x) 

Так в основном то, что происходит, у вас есть функция, которая принимает func_you 4 лямбда-функции каждый из которых использует аргумент x. В качестве примера аргументом для lambdafunc1 может быть что-то вроде lambda x: x + 10.

func_you затем возвращает новую функцию func_you_2, выход которого является произведением всех этих функций лямбды и имеет один аргумент x, который передается на x аргумент каждые из функций лямбды func_you «ы.

Предполагая, что я пытаюсь сделать, возможно, как передать правильный синтаксис для этого?

Кроме того, существует ли конкретное имя для такого рода вещей, а не «функция, возвращающая функцию»? Это технически не вложенная функция, верно?

+0

Вы были так близко! Обратите внимание, что аргументы 'func_you' не должны быть lambdas - они могут быть любой функцией, которая принимает один аргумент и возвращает то, что законно для умножения. У Lambdas _don't_ есть особые способности, которых функции 'def' не имеют. И наоборот, лямбда может содержать только одно выражение, которое строго ограничивает то, что они делают. –

ответ

2

Вы можете вернуть функцию лямбда, которая делает то, что вы хотите. Пример -

def func_you(lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4): 
    return lambda x: lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x) 

Demo -

>>> def func_you(lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4): 
...  return lambda x: lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x) 
... 
>>> f = func_you(sum,min,max,sum) 
>>> f([1,2]) 
18 
1

Это, безусловно, технически вложенная функция:

def func_you(lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4): 
    def func_you_2(x): 
     return lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x) 

    return func_you_2 

Но вы могли бы использовать lambda тоже:

def func_you(lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4): 
    return lambda x: lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x) 
3

Мой ответ не лучше, чем любой другой ответ до сих пор, но я хотел, чтобы настроить его немного сжать немного более функционально-программирование-сок из вопрос, просто для удовольствия.

from functools import reduce 
from operator import mul 

def functioners(*funcs): 
    def inner(x): 
     return reduce(mul, [f(x) for f in funcs], 1) 
    return inner 

In [2]: res = functioners(lambda x: x+1, lambda x: x *2, lambda x: x+3) 

In [3]: res(5) 
Out[3]: 480 

In [4]: res = functioners(lambda x: x+1, lambda x: x +1, lambda x: x+1) 

In [5]: res(1) 
Out[5]: 8 

Редактировать

Я даже получил немного сумасшедший с ним в целях реализации добрейших 10-минутный Карринг попытки. Это не то, что я когда-либо ставил бы перед своими коллегами, но уже поздно, когда я так, может быть, просто для удовольствия ...

Должна быть определена функция, которая может продолжать возвращать частично прикладную версию, но Наверное, тебе нужно как-то остановить это?

Вот моя попытка:

from functools import partial, reduce 
from operator import mul 

def functionals(*funcs, finished=None): 
    def inner(x): 
     return reduce(mul, [f(x) for f in funcs], 1) 

    if finished is not None: 
     # stop condition 
     return inner 
    else: 
     return partial(functionals, *funcs) 

Вы можете использовать его, как это (если вы были так склонны ...)

In [37]: f1 = functionals(lambda x: x+1) 

In [38]: f2 = f1(lambda x: x + 1) 

In [39]: f3 = f2(lambda x: x + 1, lambda x: x + 1, lambda x: x + 1) 

In [40]: f3(finished="definitely!")(1) 
Out[40]: 32 

(я получу свою шляпу и пальто сейчас ...)

0

def -within- def Структура на самом деле довольно распространена. Он используется для реализации decorator functions, которые выполняют функцию ввода, каким-то образом модифицируют его и возвращают измененную функцию. В принципе, эта структура:

@decorator 
def func(param): 
    # stuff 

так же, как:

def func(param): 
    # stuff 

func = decorator(func) 

К примеру, у вас есть несколько функций, которые вы хотите изменить таким образом, чтобы они печатают сообщения на входе и выходе. Вы пишете функцию декоратора:

def mark_entry_and_exit(func): 
    def inner(*args, **kwargs): 
     print "Entering function." 
     try: 
      result = func(*args, **kwargs) 
     except: 
      print "Exiting with exception." 
      raise 
     print "Exiting function." 
     return result 
    return inner 

Затем, чтобы использовать его, вы просто использовать @ обозначения выше:

@mark_entry_and_exit 
def my_function(a, b): 
    print "Running with", a, b 

my_function(1, b=2) 

принтами:

Entering function. 
Running with 1 2 
Exiting function. 
Смежные вопросы