来自生成器的python生成器表达式,有可能吗?

时间:2013-11-30 18:49:09

标签: python

我正在尝试转换我的功能,我想要它做同样的事情:

    def get_num(function, starting_index):
        yield starting_index
        while True:
            yield function(starting_index)
            starting_index = function(starting_index)

所以我希望新函数返回一个完全相同的genexp,当然不使用'yield',并且所有在一行中都可以吗? 感谢

2 个答案:

答案 0 :(得分:2)

首先,您可能希望避免对函数进行冗余调用:

def get_num(fn, start):
    while True:
        yield start
        start = fn(start)

答案 1 :(得分:0)

原始函数的递归版本:

def get_num(f, x):
    yield x
    yield from get_num(f, f(x))

关于同一主题:

>>> p = lambda x, f, c: chain((x,), (i for i in p(f(x), f, c))) if c(x) else (x, None)
>>> p(1, lambda x: x*2, lambda x: x < 100)
<itertools.chain object at 0x01633DD0>
>>> list(_)
[1, 2, 4, 8, 16, 32, 64, 128, None]

这可以完成原始函数的功能,但如果x满足某些条件,则会停止。

然后因为它必须是一个生成器表达式?!我们这样做:

>>> g = (i for i in _)
>>> next(g)
1
>>> next(g)
2
>>> next(g)
4
>>> next(g)
8
>>> next(g)
16

条件函数c是停止无限递归所必需的。如果Python是一种功能性语言(即懒惰的评估更常见,并且尾部递归被优化),那么这就没有必要了。