2

如何在python中做到这一点?

def f(a, b):
    return a, b+2, b+3
def g(a, b, c):
   return a+b+c

如何得到这样的k = f+g东西

k(a, b) is g(f(a,b))

请注意,这是一个抽象问题。我想知道是否有一个函数可以返回一个 concatf+g或什至 concat([...]) 通常工作而不管f.

换句话说,我想要一个 args 为fandg并返回的函数k

def concat(f,g):
  return something_equivalent_to_k_above
4

3 回答 3

4

回答原始问题

定义:

k = lambda x,y:g(*f(x,y))

例子:

>>> k(2,3)
13

修改问题的答案

定义:

concat = lambda a,b:lambda *args: b(*a(*args))

例子:

>>> k = concat(f,g)
>>> k(2,3)
13
于 2016-08-06T05:41:23.643 回答
2

至少有两种方法可以做到这一点:

方法 A(推荐):

def compound(inner_func, outer_func):
    def wrapper(*args, **kwargs):
        return outer_func(*inner_func(*args, **kwargs))
    return wrapper

注意inner_func不能返回字典,在这种情况下我们应该写return outer_func(**inner_func(*args, **argv)).

用法:

def f(a, b):
    return a, b+2, b+3
def g(a, b, c):
   return a+b+c

k = compound(f, g)

print k(1, 2)
# output: 10

方法 B:

首先,像这样定义一个“装饰器工厂”:

def decorator_factory(inner_func):
    def decorator(outer_func):
        def wrapper(*args, **kwargs):
            return outer_func(*inner_func(*args, **kwargs))
        return wrapper
    return decorator

然后你可以像这样使用它:

def f(a, b):
    return a, b+2, b+3

@decorator_factory(f)
def g(a, b, c):
   return a+b+c

print g(1, 2)
# output: 10
于 2016-08-06T07:15:48.697 回答
1

为什么不定义第三个函数,就像你对fand所做的那样g

>>> def f(a, b):
        return a, b+2, b+3

>>> def g(a,b,c):
        return a+b+c

>>> def k(a,b):
        return g(*f(a,b))

>>> k(2,3)
13
于 2016-08-06T05:51:46.310 回答