这个函数可以用生成器来表示吗?

2024-06-02 11:24:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下功能:

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

有没有可能把这表达成一种理解?如果我们处理的是一个固定范围,而不是一个无限序列,它可以这样处理:(编辑:实际上那是错误的)

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

但既然我们处理的是一个无限序列,有没有可能用生成器来表达呢?你知道吗


Tags: in功能true编辑forvaluedef错误
3条回答

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

from itertools import accumulate, repeat

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

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

不过,请把它全部写出来。你知道吗

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

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

其中__currentgenerator__是对它所在的生成器表达式的一个假设的魔法引用。(请注意,问题不是您想要一个无限序列,而是该序列是根据自身递归定义的。)

不幸的是,Python没有这样的特性。Haskell就是这样一种语言的例子,由于其懒惰的参数求值:

infinite_sequence = map f x:infinite_sequence

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

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。)

是的,只要使用无限迭代器,比如^{}。你知道吗

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

相关问题 更多 >