我正在尝试转换我的功能,我想要它做同样的事情:
def get_num(function, starting_index):
yield starting_index
while True:
yield function(starting_index)
starting_index = function(starting_index)
所以我希望新函数返回一个完全相同的genexp,当然不使用'yield',并且所有在一行中都可以吗? 感谢
答案 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是一种功能性语言(即懒惰的评估更常见,并且尾部递归被优化),那么这就没有必要了。