python - 这个函数可以用生成器理解来表达吗?

标签 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))

但由于我们正在处理无限序列,是否可以使用生成器理解来表达它?

最佳答案

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

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/

相关文章:

python - 基于多个级别 1 列的子集多索引 df

python - 如何修复 *args 和 **kwargs 的 'got multiple values for argument' 错误?

javascript - 多次调用另一个js文件的生成器函数并与生成器同步运行

python - 将局部变量添加到正在运行的生成器

go - 检查 channel 的值

python - 是否有无限迭代器的表达式?

python - python中的平方根循环

python - 减少matplotlib中的X轴

Python 类定义分配属性

C++ 强随机数生成器 - 必要吗?