单行 Python 代码中可以使用求和和乘积符号吗?

Can summation and product notations be used in a single line of Python code?

我目前正在处理一些数学问题。有些涉及双重求和,而另一些涉及双重乘积。有些包括与乘积的组合求和。

Python 允许在一行代码中进行双重求和。举个例子:

\sum_{x=1}^{2}\left ( \sum_{y=1}^{3} \left ( x+y \right )\right )= 21

这可以用一行代码简单地解决:

>>> sum((x + y) for y in range(1,4) for x in range(1,3))
21

同样,单行代码就可以计算出双乘。示例:

\prod_{x=1}^{2}\left ( \prod_{y=1}^{3} \left ( x+y \right )\right )= 1440

以及使用 Python 3.8 的编码解决方案:

>>> import math
>>> math.prod((x + y) for y in range(1,4) for x in range(1,3))
1440

如何完成类似的单求和单积题?是否可以使用一行代码?例如:

\sum_{x=1}^{2}\left ( \prod_{y=1}^{3} \left ( x+y \right )\right )= 84

我认为这可能很简单:

>>> sum((math.prod(x + y)) for y in range(1,4) for x in range(1,3))
TypeError: 'int' object is not iterable

但是 print(dir(sum))print(dir(math.prod)) 显示魔术方法 __iter__ 在 sum 和 math.prod 中都不存在,因此出现 TypeError。

我知道我可以像这样使用 for 循环:

>>> ans = 0
>>> for x in range(1,3):
...         ans += math.prod((x + y) for y in range(1,4))
>>> ans
84

但是当我在同一个方程中有更多的求和和乘积时(最多四个,偶尔更多),这会变得有点混乱。

是否有一种简单的单一代码行方法来组合我缺少的求和和乘积?还是 for 循环方法是唯一的方法?有什么想法吗?

sum(math.prod(x + y for y in range(1, 4)) for x in range(1, 3))

数学符号中的括号是您的指南。我们需要做的是分别考虑每个summation/product步骤。

当我们进行乘积求和时,每个乘积的形式为

math.prod(x + y for y in range(1, 4))

(请注意 x + y 两边的括号不是必需的。)

请注意 x 在这里未定义 - 到目前为止,它是一个自由变量(用数学术语来说)。

所以,我们在求和的时候绑定它:

sum(math.prod(x + y for y in range(1, 4)) for x in range(1, 3))

其计算结果为所需的 84

这有助于理解句法结构背后的理论。当我们写 sum(f(x) for x in xs) 时,我们将 生成器表达式 传递给内置的 sum 函数。它的功能类似于 list comprehension(它又建立在集合构建器符号的数学概念之上),除了元素将按需确定为 sum 迭代它们,而不是被急切地评估并立即存储在内存中。通常,生成器表达式将使用一对括起来的括号来编写,因此 (f(x) for x in xs); Python 有一个特殊的语法规则,当你调用一个带有 单个 参数的函数时,它是一个生成器表达式,你可以省略这对括号(因为它们是与用于函数调用的那些冗余)。

有关列表理解的更多详细信息,请参阅 Trey Hunner's excellent guide。基本技术同样适用于 Python 中的各种理解以及生成器表达式。