0

抱歉,这似乎是一个基本问题,但我在任何地方都找不到。在 Python 2 中,我想将一个 1 变量函数应用于其自己的输出,存储所有步骤的列表,即如果 f(x) 返回 x*x 然后从 2 迭代,我需要得到

[2, 4, 16, 256, 65536, ...]

理想情况下,我需要传入我的函数f、第一个输入1以及我想保留的迭代次数。

我想这在某种意义上与函数式编程相反reduce并且有点相似unfold

一个天真的方法是写

out = [2] for x in xrange(5): out.append(f(out[-1]))

什么是一个好的 Pythonic 方式来做到这一点?非常感谢你。

4

2 回答 2

2

你需要的是一个“生成器”。例如,

def f(x, n):
    for _ in range(n):
        yield x
        x = x * x

l = list(f(2, 5))

print(l)             # [2, 4, 16, 256, 65536]

或者

def f(x):
    while True:
        yield x
        x = x * x

for v in f(2):
    if v > 100000:
        break
    print(v),        # 2 4 16 256 65536
于 2015-02-04T02:36:46.393 回答
1

理想情况下,我需要传入我的函数 f、第一个输入 1 以及我想要保留的迭代次数。

这是一个展开函数,它接受一个函数、一个起始值和一个迭代计数。

def unfold(function, start, iterations):
    results = []
    for _ in range(iterations):
        results.append(start)
        start = function(start)

    return results

您可以按预期使用:

>>> print unfold(lambda x: x*x, 2, 5)
[2, 4, 16, 256, 65536]
于 2015-02-04T02:51:21.793 回答