【问题标题】:Python: Understanding reduce()'s 'initializer' argumentPython:理解 reduce() 的“初始化器”参数
【发布时间】:2013-10-14 17:19:35
【问题描述】:

我对 Python 比较陌生,遇到了麻烦
使用 Folds 或更具体地说,reduce() 的 'initializer' 参数

例如reduce(function, iterable[, initializer])

这里是函数...

>>> def x100y(x,y):
...     return x*100+y

有人能解释一下为什么 reduce() 会产生 44...

>>> reduce(x100y, (), 44)
44

或者为什么它在这里产生 30102...

>>> reduce(x100y, [1,2], 3)
30102

【问题讨论】:

标签: python functional-programming reduce fold higher-order-functions


【解决方案1】:

来自文档:

reduce(function, iterable[, initializer])

应用两个函数 参数从左到右累积到可迭代项, 以便将可迭代减少为单个值。例如, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算 ((((1+2)+3)+4)+5)。左边的参数 x 是累积值,并且 正确的参数 y 是来自可迭代对象的更新值。如果 可选初始化器存在,它被放置在项目之前 在计算中可迭代,并在可迭代时用作默认值 是空的。如果没有给出初始化程序并且可迭代只包含一个 item,返回第一个 item。

初始化器作为元素 0 放置在您的可迭代对象中,如果您的可迭代对象中没有元素,则将其返回。 (所以这就是你得到 44 的原因)

另外,x100y 不是一个有效的 python 函数。如果你想把它变成一个有效的python函数,你必须这样做

reduce(lambda x,y: x*100*y,[1,2],3)

相当于

(3*100*1)*100*2 应该给出 60000 (为什么你得到你所拥有的值可能是因为一个错误)

关于 lambda 的文档是 here

【讨论】:

  • 谢谢先生。我阅读了文档,但您的表述方式更加清晰。同样,我很清楚:如果提供了一个参数 (egreduce(x100y, [15]) 或 reduce(x100y, (), 44)),reduce() 将不会运行而是返回提供的数字?
  • @KevinZerbo 再次阅读:初始化程序无论如何都会影响计算。不大于也不小于累加器的起始值。
  • @KevinZerbo 你是对的。所以基本上 reduce(x100y,[15]) 等价于 reduce(x100y,[], 15)。由于迭代中没有足够的元素来完成函数 x100y 它只是返回 15 而不是通过函数运行它。
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多