【问题标题】:Python reduce opposite: generate values by invoking function on previous returned valuePython reduce 相反:通过对先前返回的值调用函数来生成值
【发布时间】:2015-11-16 22:17:48
【问题描述】:

我想知道 Python (2.7) 中是否有与 reduce 函数相反的东西。我知道 reduce 的工作方式如下:

reduce( lambda x,y : x+y, [1,2,3,4,5]) == 15.

它接受第一个参数和第二个参数,并从第一个参数调用函数,然后它获取结果和列表中的下一项并再次调用函数。

我想做相反的事情 - 从一个元素生成列表。会是:

reduce_opposite( lambda x: x**2, 3, n_times=3) == [(3 ** 2), (9 ** 2), (81 ** 2)]

接受一个函数、一个初始参数和n 并将这个初始参数作为函数的输入。然后将结果存储在一个列表中,并再次调用函数,但使用之前调用的结果。

在 Python 中有这样的东西吗?如果不是......只是出于好奇,任何语言都有这样的东西吗?你怎么称呼它?我正在寻找一些很短的东西。我可以编写自己的复杂函数来执行此操作。

【问题讨论】:

  • 我也想知道“reduce_opposite”概念的正式名称是什么。

标签: python function higher-order-functions


【解决方案1】:

据我所知,没有内置函数可以做到这一点,但是编写一个生成器(或类似的东西)来做同样的事情非常简单。例如:

def reduce_opposite(fn, start, n_times=3):
    for _ in range(n_times):
        start = fn(start)
        yield start

然后:

>>> list(reduce_opposite(lambda x: x**2, 3, n_times=3))
[9, 81, 6561]

生成器在调用之间保留其局部变量的事实使这成为可能。

【讨论】:

  • 不应该xrange(...)range(...) 更好吗?
  • 如果你使用 Python 2 并且n_times 不小,那么xrange 应该替换上面代码中的range ,是的。 (我想我在写这个答案时使用的是 Python 3 - 那里没有 xrange。)
猜你喜欢
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2020-02-24
相关资源
最近更新 更多