【问题标题】:Assign multiple functions to a single variable?将多个函数分配给单个变量?
【发布时间】:2016-09-23 19:32:07
【问题描述】:

在 Python 中,我们可以将函数分配给变量。比如 math.sine 函数:

sin = math.sin
rad = math.radians
print sin(rad(my_number_in_degrees))

是否有任何简单的方法可以将多个函数(即一个函数的函数)分配给一个变量?例如:

sin = math.sin(math.radians) # I cannot use this with brackets
print sin (my_number_in_degrees)

【问题讨论】:

  • sinrad = lambda n: math.sin(math.radians(n)) ?
  • 澄清一下,您所描述的并不是将多个函数分配给一个变量。它分配了一个函数,恰好是另外两个函数的组合。

标签: python


【解决方案1】:

您可以编写一个辅助函数来为您执行function composition 并使用它来创建您想要的变量类型。一些不错的功能是它可以将可变数量的函数组合在一起,每个函数都接受可变数量的参数。

import math
try:
    reduce
except NameError:  # Python 3
    from functools import reduce

def compose(*funcs):
    """ Compose a group of functions (f(g(h(...)))) into a single composite func. """
    return reduce(lambda f, g: lambda *args, **kwargs: f(g(*args, **kwargs)), funcs)

sindeg = compose(math.sin, math.radians)

print(sindeg(90))  # -> 1.0

【讨论】:

    【解决方案2】:

    我认为作者想要的是某种形式的函数链。一般来说,这很困难,但对于那些

    1. 采用单个参数,
    2. 返回单个值,
    3. 列表中前一个函数的返回值与下一个函数的输入类型为列表的类型相同

    假设有一个我们需要链接的函数列表,其中包含一个参数,并返回一个参数。此外,类型是一致的。像这样的......

    functions = [np.sin, np.cos, np.abs]
    

    是否可以编写一个将所有这些链接在一起的通用函数?好吧,我们可以使用 reduce,虽然 Guido 并不特别喜欢 mapreduce 的实现,并且正准备将它们淘汰...

    类似这样的...

    >>> reduce(lambda m, n: n(m), functions, 3)
    0.99005908575986534
    

    现在我们如何创建一个执行此操作的函数?好吧,只需创建一个接受值并返回函数的函数:

    import numpy as np 
    
    def chainFunctions(functions):
        def innerFunction(y):
            return reduce(lambda m, n: n(m), functions, y)
        return innerFunction
    
    if __name__ == '__main__':
        functions = [np.sin, np.cos, np.abs]
        ch = chainFunctions( functions )
        print ch(3)
    

    【讨论】:

      【解决方案3】:

      只需创建一个包装函数:

      def sin_rad(degrees):
          return math.sin(math.radians(degrees))
      

      像往常一样调用你的包装函数:

      print sin_rad(my_number_in_degrees)
      

      【讨论】:

      • 这对于这样的东西来说已经足够了,而且更具可读性。
      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多