这个功能可以用生成器理解来表达吗?

时间:2014-11-15 13:23:39

标签: python generator

我有以下功能:

def infinite_sequence(starting_value, function):
    value = starting_value
    while True:
        yield value
        value = function(value)

是否可以将其表达为生成器理解?如果我们处理的是固定范围而不是无限序列,则可以这样处理:(编辑:实际上错误)

(function(value) for value in range(start, end))

但是既然我们处理的是无限序列,是否可以使用生成器理解来表达它?

3 个答案:

答案 0 :(得分:1)

您需要某种递归生成器表达式:

infinite_sequence = itertools.imap(f, itertools.chain(x, __currentgenerator__))

其中__currentgenerator__是对其生成的生成器表达式的假设魔术引用。(请注意,问题不是您想要无限序列,而是根据自身递归定义序列。)< / p>

不幸的是,Python没有这样的功能。由于其懒惰的参数评估,Haskell是一种语言的例子:

infinite_sequence = map f x:infinite_sequence

但是,通过定义递归生成器,您仍然可以在使用def语句时在Python 3中实现类似的功能。

def infinite_sequence(f, sv):
    x = f(sv)
    yield from itertools.chain(x, infinite_sequence(f, x))

itertools.chain并非严格必要;您可以使用

def inifinite_sequence(f, sv):
    x = f(sv)
    yield x
    yield from infinite_sequence(f, x)

但我试图保留Haskell表达式x:infinite_sequence的味道。)

答案 1 :(得分:0)

这是itertools.accumulate,忽略除第一个值以外的所有值:

from itertools import accumulate, repeat

def function(x): return x*2
start = 1

seq = accumulate(repeat(start), lambda last, _: function(last))

尽管如此,请完整地写出来。

答案 2 :(得分:-1)

是的,只需使用无限迭代器,例如itertools.count

(function(value) for value in itertools.count(starting_value))