我有以下功能:
def infinite_sequence(starting_value, function):
value = starting_value
while True:
yield value
value = function(value)
是否可以将其表达为生成器理解?如果我们处理的是固定范围,而不是无限序列,则可以这样处理:(编辑:实际上这是错误的)
(function(value) for value in range(start, end))
但由于我们正在处理无限序列,是否可以使用生成器理解来表达它?
最佳答案
你需要某种递归生成器表达式:
infinite_sequence = itertools.imap(f, itertools.chain(x, __currentgenerator__))
其中 __currentgenerator__
是对它所在的生成器表达式的假设魔术引用。(请注意,问题不是您想要一个无限序列,而是序列是根据自身递归定义的.)
不幸的是,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
的风格。)
关于python - 这个函数可以用生成器理解来表达吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26946306/