【发布时间】:2018-12-01 09:30:04
【问题描述】:
我只是在学习 Python,不了解我从 reduce 函数中得到的行为。我见过很多例子,当你想乘法时,你可以使用 reduce 来执行等效的求和函数:
f = [2,3,4]
reduce(lambda x,y: x*y,f)
这给了我期望的价值。但我需要乘以所有倒数。我想我可以这样做:
reduce(lambda x,y: 1/x * 1/y, f)
但结果是 1.5 而不是一些小得多的十进制答案。我做错了什么?
【问题讨论】:
-
您是否尝试过在计算中使用括号:
reduce(lambda x,y: (1/x) * (1/y), f)? -
@LukasBach:碰巧,在这种情况下,括号(大部分)是不相关的(主要是因为运算顺序会稍微改变浮点数学的结果)。即使没有括号,它也会变成
((1 / x) * 1) / y,这在逻辑上是等价的。问题在x的意思。 -
“取倒数”部分更适合
map,而不是将其折叠到reduce:reduce(lambda x, y: x*y, map(lambda x: 1/x, f))。 -
(当然,使用
reduce、map或lambda在Python中并不像在函数式语言中那样受到鼓励,并且将所有倒数相乘是相当于将所有数字相乘并在最后取倒数一次,这会更容易。)