两个功能的产物

max*_*max 3 python functional-programming python-3.x

我有两个功能,fg.两者都有相同的签名:(x).我想创建一个z具有相同签名的新函数:

def z(x):
  return f(x) * g(x)
Run Code Online (Sandbox Code Playgroud)

除了我想能写

z = f * g而不是上面的代码.可能吗?

Eli*_*sky 10

一些接近可能的:

z = lambda x: f(x) * g(x)
Run Code Online (Sandbox Code Playgroud)

就个人而言,我觉得这种方式更直观z = f * g,因为在数学上,乘法函数并不意味着什么.根据解释*运营商,这可能意味着组成等等z(x) = f(g(x)),但绝对不是乘法调用的结果.另一方面,lambda上面是非常明确的,坦率地说只需要更多的字符来编写.


更新:感谢JBernardo一起攻击它.我想象它会比结果更糟糕.不过,我建议不要在实际代码中使用它.


JBe*_*rdo 8

有趣的是,它很有可能.几天前我做了一个项目来做这样的事情.

这是:FuncBuilder

到目前为止,您只能定义变量,但您可以在其他函数的帮助下使用我的元类来构建您想要的类.

问题:

  • 这很慢
  • 这真的很慢
  • 你认为你想要这样,但是以他们想要描述的方式描述功能是正确的方式.

你应该使用你的第一个代码.

正如概念证明:

from funcbuilder import OperatorMachinery

class FuncOperations(metaclass=OperatorMachinery):
     def __init__(self, function):
          self.func = function
     def __call__(self, *args, **kwargs):
          return self.func(*args, **kwargs)

def func(self, *n, oper=None):
    if not n:
        return type(self)(lambda x: oper(self.func(x)))
    return type(self)(lambda x: oper(self.func(x), n[0](x)))

FuncOperations.apply_operators([func, func])
Run Code Online (Sandbox Code Playgroud)

现在你可以这样编码:

@FuncOperations
def f(x):
    return x + 1

@FuncOperations
def g(x):
    return x + 2
Run Code Online (Sandbox Code Playgroud)

并且期望的行为是:

>>> z = f * g
>>> z(3)
20
Run Code Online (Sandbox Code Playgroud)

我在FuncBuilder项目中添加了一个更好的版本.它适用于FuncOperation对象和另一个可调用对象之间的任何操作.也适用于一元操作.:d

您可以使用它来制作以下功能:

z = -f + g * h
Run Code Online (Sandbox Code Playgroud)