python生成器表达式更改值

时间:2013-11-27 16:04:08

标签: python generator

我想创建一个返回生成器exp的函数。 我试着做这样的事情:

return (f(value) value=f(value) for i in itertools.count(1))

但它不起作用。 我希望每个下一步的值都是值接收最后一个值。 f这是对值进行一些计算的函数。

好的我有功能:

def f(num):
    return num*num

我想创建返回生成器表达式的新函数。 像这样的东西:

  def genE(f,value)
     return (f(value) value=f(value) for i in itertools.count(1))

所以如果我打电话给genE:

for i in genE(f,3):
    print (i)

它将打印3 9 81 81 ^ 2 ... 函数f可以是另一个函数     [value,f(value),f(f(value)),f(f(f(value)))...]

2 个答案:

答案 0 :(得分:1)

并不完全清楚你的意思。你有一个价值:

value = ...

和一个功能:

def f (value):
     ...

并且您想要返回一个新列表:

[value, f(value), f(f(value)), f(f(f(value)))...]

所以我认为你想要的(列表长度为i)是......

def g (value, i):
    if i > 0:
        yield value
        g(f(value), i-1)

答案 1 :(得分:0)

不要使用生成器表达式,使用生成器函数:

def iterate(f, value):
    while True:
        yield value
        value=f(value)

yield关键字标记值“生成”的点。调用iterate时,它将返回一个生成器对象。

您可能希望阅读有关fixed point combinators及相关主题的内容,因为您对此类内容有很多了解。

这里正在使用:

import itertools
powers = iterate(lambda n:n*n, 3)
list(itertools.takewhile(lambda n: n <= 30000, powers))
#=>[3, 9, 81, 6561]