【发布时间】:2013-03-16 05:23:45
【问题描述】:
我需要一个 Python 函数 iterate(f, x),它创建一个迭代器,返回值 x、f(x)、f(f(x))、f(f(f(x))) 等(例如, Clojure's iterate)。首先,我想知道:这是否已经存在于标准库中的某个地方而我只是想念它?当然,使用生成器很容易实现:
def iterate(f, x):
while True:
yield x
x = f(x)
只是出于好奇:在 Python 中是否有更实用的方法来执行此操作,例如使用一些 itertools 或 functools 魔法?
在 Python 3.3 中这可以工作
def iterate(f, x):
return accumulate(repeat(x), lambda acc, _ : f(acc))
但对我来说似乎是一种虐待。我可以做得更好吗?
【问题讨论】:
-
我会说
accumulate()版本很好。 两个版本都很好。 -
我对@987654328@ 版本真正感到奇怪的是需要
repeat(x)或类似的东西,因为x 实际上只需要一次 作为计算的种子. -
@embee 既然你提到了它,我也觉得这很奇怪。 Prob best 作为第一个解决方案
-
作为@Ned 提到的Haskell 势利小人之一,我想说的是,有一种从单个 初始值生成
iterate的好方法:通过使用anamorphism(本质上与reduce相反)。 -
这基本上就是我要找的东西,@phg,这就是我使用“递归”这个词的原因。但是你会如何用 Python 来表达呢?
标签: python functional-programming iterator generator itertools