from functools import reduce # Функция для свёрки последовательности
from operator import mul # Функция, перемножающая 2 числа
spisok = [16, 15, 9, 14, 13] # Исходный список
result = reduce(mul, spisok)
# /\ Список для свёртки
# /\ Используем умножение
# /\ Сворачиваем контейнер
let num = Number(prompt())
let lis = []
let mult = []
while (num) {
num = Number(prompt())
lis.append(num)
}
var m = 1
for (let n = 0; n < lis.length; n++) {
m = m*lis[n]
mult.append(m)
}
过去可以使用 reduce()。现在也是可以的,但是这个函数已经被移到了一个单独的模块中,所以严格来说,计算导入,我们得到两行:
这里的所有答案都落伍了。python-3.8及更高版本呢?
数学产品
这可能是最简单和最标准的解决方案恕我直言。
你可以实现一个功能
mul要么像这样,借助帮助
lambda和递归您可以通过导入来做到这一点:
如果你真的想,你可以写成一行,当然你不应该那样做,例如,multiply '2 3 4 5' = 120
我将在一行中给出一个不太实用但很漂亮的解决方案。它不使用
eval、列出副作用或命名函数。如果允许命名函数,则解决方案可能如下所示:
它不适合我们,所以命名函数至少需要两行来定义和调用。可以在一行中定义和调用 lambda,但创建递归 lambda 存在困难。Python 语法允许这个技巧:
这正是在同一行上使用全局变量和两个语句的技巧。你完全可以不用全局变量。乍一看,这不可能,因为进行递归调用需要名称。但是一个函数可以作为参数传递给它自己:
看来我们什么都没赢:无论如何,两个运算符和一个全局变量
p。但是,已经采取了非常重要的一步——lambda 的主体不使用全局变量。全局变量在语句中使用print。让我们摆脱它:它只会变得更糟:三行和两个全局变量。但是每个全局变量只涉及一次。我们做一个替换:
它很难阅读,但是没有全局名称和魔术调用,问题就在一行中解决了
eval。PS 阅读定点组合器以找出该解决方案的来源。
PPS 还有一个迷人的说法:任何复杂的程序都可以在不定义单个全局变量(包括函数名)的情况下以函数式风格编写。
PPPS 不要在家里尝试这个。