【问题标题】:Python function that takes two functions and returns the concatenated function?接受两个函数并返回连接函数的 Python 函数?
【发布时间】:2021-01-01 15:37:03
【问题描述】:

我需要编写一个名为 'concat' 的 python 函数,它将任意两个函数作为输入,并返回一个函数,该函数是两个输入函数的连接函数(即它需要 f1 和 f2,并返回 f1◦f2 )。

我试过了:

def concat(f1,f2):
    return f1(f2)

例如,如果 f1 和 f2 是:

def f1(x):
    return x+2
def f2(x):
    return x*2

那么,concat(f1,f2) 应该返回:(x*2)+2

我希望能够像这样使用它:

a = concat(f1,f2)
a(5)

但我得到一个错误:

TypeError: +: 'function' 和 'int' 的操作数类型不受支持

我知道我可以这样定义函数:

def concat(f1,f2,x): 
    return f1(f2(x))

但这不是我想要的;我希望能够创建 concat 函数的实例,然后可以使用任何 x 调用它。

【问题讨论】:

标签: python function concatenation


【解决方案1】:

您需要返回一个新的“包装器”函数。一种选择是使用lambda 表达式:

def concat(f1, f2):
    return lambda x: f1(f2(x))

文档: https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions

【讨论】:

  • 我想补充一点,就地创建 lambda 函数可能是调用执行此操作的函数的更好选择。 lambda大家都知道,但是concat()的含义和作用却不是大家都知道。
  • 函数 composition 不是正确的词吗?
  • 是的,OP 的目标是制作功能组合。我没有去答案中的术语定义,因为它并没有真正影响他描述得很清楚的问题的解决方案。不过,他可能会发现您的 cmets 很有用。
【解决方案2】:

我想你想要的是closure

def concat(f1, f2):
  def f3(x):
    return f1(f2(x))
  return f3

Python 中的函数被视为第一类对象。这允许它们像普通变量一样被创建和操作。在这种情况下,concat 正在构造一个由两个函数组成的新函数。

这里使用的第二个属性是词法作用域。新函数保留对定义它的局部变量的访问权,而不是执行它的地方。这允许返回的函数在任何地方运行,而不会失去对复合函数的访问。

【讨论】:

    【解决方案3】:

    这是组合两个以上函数的可能解决方案。使用闭包循环函数并将前一个函数的结果用作下一个函数的参数:

    def compose(*fns):
        def F(x):
            for fn in fns[::-1]:
                x = fn(x)
            return x
        return F
    

    然后定义你的组合并调用:

    >>> F = compose(f1, f2, lambda x: x+1)
    >>> F(4)
    12 # f1(f2(f3(x)))
    

    【讨论】:

      猜你喜欢
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 2018-09-19
      • 1970-01-01
      • 2019-10-27
      • 2018-06-12
      • 1970-01-01
      相关资源
      最近更新 更多