python中reduce函数的作用_python中reduce函数的行为

您需要的是map和reduce:>>> from functools import reduce

>>> yourlist = [2, 3]

>>> reduce(lambda x, y: x*y, map(lambda x: (1-1/x), yourlist))

0.33333333333333337

>>> yourlist = [2, 3, 5]

>>> reduce(lambda x, y: x*y, map(lambda x: (1-1/x), yourlist))

0.2666666666666667

因为map将每个项转换为(1-1/item),然后reduce将它们全部相乘。在

附加说明:

您还可以使用更快的^{}代替lambda x, y: x * y,例如:

^{pr2}$

感谢@acushner指出这一点(在评论中)。在

你的功能出了什么问题

在这种情况下,很容易看出什么不起作用,只需使用一个命名函数并添加一些prints:def myfunc(x, y):

print('x = {}'.format(x))

print('y = {}'.format(y))

res = (1 - 1.0/x) * (1 - 1.0/y)

print('res = {}'.format(res))

return res

reduce(myfunc, [2, 3])

# x = 2

# y = 3

# res = 0.33333333333333337

reduce(myfunc, [2, 3, 5])

# x = 2

# y = 3

# res = 0.33333333333333337

# x = 0.33333333333333337

# y = 5

# res = -1.5999999999999996

所以它使用最后一个结果作为“next”x值。这就是为什么它适用于length-2-list的情况,但是对于更多的元素,它并没有应用您想要的公式。在

备选方案

您还可以使用一个简单的for循环,而不是使用map和reduce循环。把它们弄对要容易得多,而且大多数时候它们更具可读性(在某些情况下,它比reduce更快)。在prod = 1

for item in yourlist:

prod *= 1 - 1 / item

print(prod)

是的,现在它不是1行,而是4行长,但是很容易理解发生了什么(但是可能有一些边缘情况,它的行为不像reduce,例如对于空输入)。在

但我通常更喜欢简单的循环而不是复杂的reduce-操作,但总是YMMV。:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值