我有以下功能:
def infinite_sequence(starting_value, function):
value = starting_value
while True:
yield value
value = function(value)
是否可以将其表达为生成器理解?如果我们处理的是固定范围而不是无限序列,则可以这样处理:(编辑:实际上错误)
(function(value) for value in range(start, end))
但是既然我们处理的是无限序列,是否可以使用生成器理解来表达它?
答案 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))