在 Python 中根据自己的输出生成迭代列表
Generating list of iterations on own output in Python
抱歉,这似乎是一个基本问题,但我无法在任何地方找到它。在 Python 2 中,我想将一个 1 变量函数应用于它自己的输出,存储所有步骤的列表,即如果 f(x) returns 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 方法来做到这一点?
非常感谢。
你需要的是一个“Generator”。例如,
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
Ideally, I would need to pass in my function f, the first input 1, and
the number of iterations I would like to keep.
这是一个展开函数,它接受一个函数、一个起始值和一个迭代计数。
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]
抱歉,这似乎是一个基本问题,但我无法在任何地方找到它。在 Python 2 中,我想将一个 1 变量函数应用于它自己的输出,存储所有步骤的列表,即如果 f(x) returns 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 方法来做到这一点? 非常感谢。
你需要的是一个“Generator”。例如,
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
Ideally, I would need to pass in my function f, the first input 1, and the number of iterations I would like to keep.
这是一个展开函数,它接受一个函数、一个起始值和一个迭代计数。
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]