Оценка функциональных объектов из функции в Python - PullRequest
2 голосов
/ 23 октября 2011

Допустим, у нас есть два определенных функциональных объекта

add1 = lambda x: x+1

и

square = lambda x: x*x  

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

def addFuncs(f,g):
    f+g

addFuncs(add1,square)(10)

Что, как я думал, даст мне ответ 111 (10 * 10 + 10 + 1) Но это только что дало мне ошибку TypeError: unsupported operand type(s) for +: 'function' and 'function'
Итак, я попробовал:

def addFunctions(f, g):
    def getf():
        return f
    def getg():
        return g
    return getf() + getg()

Но все равно безрезультатно ...
Однако, если я сделаю

def addFunctions(f, g):
    return f

он появляется с 100, поэтому кажется, что он оценивает функцию по возвращении, но я не могу понять, как заставить его сначала оценивать функции, а затем оперировать ими.
Любая помощь будет принята с благодарностью!

EDIT
Понял!

def addFunctions(f, g):
    return lambda x: f(x) + g(x)

Ответы [ 3 ]

3 голосов
/ 23 октября 2011
def addFuncs(f,g):
    return lambda x: f(x) + g(x)

addFuncs(add1,square)(10)

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

1 голос
/ 23 октября 2011

Ваша оригинальная идея будет работать, если вы вместо этого вызовете эти функции и затем добавите их возвращаемые значения, вместо того, чтобы пытаться добавить их сами;

def addFuncs(f,g,x):
    f(x) + g(x)

Это потому, что f и g на самом деле LambdaTypes , и оператор () вызывает их, позволяя оператору + добавлять свои возвращаемые значения.Когда вы используете оператор + непосредственно на них, оператор + не знает, как добавить два типа Lambda.

РЕДАКТИРОВАТЬ Чтобы добавить немного больше;Причина, по которой

def addFunctions(f, g):
    def getf():
        return f
    def getg():
        return g
    return getf() + getg()

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

def addFunctions(f, g):
    return f

БУДЕТ работать, потому что это просто вернет другой объект-функцию, который затем вызывается с аргументом значения 10 в вашем выражении

addFuncs(add1,square)(10)
0 голосов
/ 23 октября 2011

addFuncs принимает произвольно много функций в качестве входных данных и возвращает функцию:

def addFuncs(*funcs):
    def _addFuncs(*args):
        return sum(f(*args) for f in funcs)
    return _addFuncs
add1 = lambda x: x+1
square = lambda x: x*x

print(addFuncs(add1,square)(10))

приводит к

111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...