单行 Python 代码中可以使用求和和乘积符号吗?
Can summation and product notations be used in a single line of Python code?
我目前正在处理一些数学问题。有些涉及双重求和,而另一些涉及双重乘积。有些包括与乘积的组合求和。
Python 允许在一行代码中进行双重求和。举个例子:

这可以用一行代码简单地解决:
>>> sum((x + y) for y in range(1,4) for x in range(1,3))
21
同样,单行代码就可以计算出双乘。示例:

以及使用 Python 3.8 的编码解决方案:
>>> import math
>>> math.prod((x + y) for y in range(1,4) for x in range(1,3))
1440
如何完成类似的单求和单积题?是否可以使用一行代码?例如:

我认为这可能很简单:
>>> 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 中的各种理解以及生成器表达式。
我目前正在处理一些数学问题。有些涉及双重求和,而另一些涉及双重乘积。有些包括与乘积的组合求和。
Python 允许在一行代码中进行双重求和。举个例子:
这可以用一行代码简单地解决:
>>> sum((x + y) for y in range(1,4) for x in range(1,3))
21
同样,单行代码就可以计算出双乘。示例:
以及使用 Python 3.8 的编码解决方案:
>>> import math
>>> math.prod((x + y) for y in range(1,4) for x in range(1,3))
1440
如何完成类似的单求和单积题?是否可以使用一行代码?例如:
我认为这可能很简单:
>>> 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 中的各种理解以及生成器表达式。