【问题标题】:Multiplication of functions in PythonPython中的函数乘法
【发布时间】:2019-01-02 21:53:57
【问题描述】:

假设我们在 Python 中定义了两个函数 f(x) 和 g(x)。 对于每个 x,如 x = 7,h = f(7) * g(7) 是一个数字。

但是,如果我们尝试分配函数 h = f * g 的类型

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

我的问题是:为什么在 Python 中做这样的操作不是微不足道的(从 Python 的工作原理来看)?当然,在许多情况下,给定两个函数,我们希望能够操纵给出它们的逐点乘积的函数?

或者仅仅是这种情况永远不会发生?事实上,我们可以很容易地定义函数 f(x)*g(x)。

【问题讨论】:

  • 函数相乘没有任何意义。函数是对象。 object * object 是什么意思?您想将函数的返回值相乘。这两个语句不等价
  • 同意@DeepSpace 的观点。您将有更好的运气创建一个新函数/ lambda,它将计算两个函数的结果相乘。
  • 因为 Python 是一种编程语言,而不是数学抽象
  • @DeepSpace 将f * g 定义为lambda x: f(x) * g(x) 是完全合理的。但是,将f * g 定义为两个函数的convolution 也是完全合理的。此外,Python 也比数学函数更通用,您很快就会遇到如何定义具有“不兼容”调用签名的函数乘积的问题。 (2-argument 函数和 1-argument 函数的乘积是什么?相同关键字参数的冲突使用呢?等等)
  • @chepner Python 不仅仅处理数字。如果finsert_to_dbgmake_coffief * g 是什么意思?恕我直言,函数级运算符过于模糊和抽象。这就是我所说的“没有任何意义”

标签: python python-3.x


【解决方案1】:

或者仅仅是这种情况永远不会发生?事实上,我们可以很容易地 定义函数f(x)*g(x)

你是对的。 应该只有一种方式来做某事,而这种方式就是定义一个新功能。顺便说一句,符号 f * g 是模棱两可的,因为在许多情况下,它表示函数组合,即 f(g(x))

【讨论】:

  • 什么上下文?组合的常用运算符是 ,尽管它(像所有 Unicode 字符一样)在 Python 中不是公认的运算符。 * 可以被认为是 ASCII 替代品,但由于它在 Python 中被这样使用,因此称其为“模棱两可”有点牵强。
  • IMO,在 Python 中支持函数级运算符的最大障碍是为函数定义它们的语义。如果fg 采用单个参数,h(x) = f(x) * g(x) 很好,但是如果f 采用两个参数而g 采用一个参数,f * g 应该是什么意思?如果fg 都接受一个名为foo 的关键字参数,但f 期望它是一个整数而g 期望它是一个元组怎么办?当您尝试将许多不错的数学概念应用于 Python 的函数模型时,它们就会分崩离析。
  • @chepner,在手写数学的背景下,老派。仅仅因为代码与书面约定在其他地方被打破并不能证明在这里模棱两可,这是一个错误的论点。我只是在谈论这个具体案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
相关资源
最近更新 更多