max*_*max 3 python functional-programming python-3.x
我有两个功能,f和g.两者都有相同的签名:(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一起攻击它.我想象它会比结果更糟糕.不过,我建议不要在实际代码中使用它.
有趣的是,它很有可能.几天前我做了一个项目来做这样的事情.
这是: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)