5

可能重复:
如何克隆 Python 生成器对象?

假设我有一个生成器“stuff_to_try”,我可以一个一个地尝试它们,但是如果我有一个想要通过生成器的方法并且该方法是递归的,我想让每个递归都得到一个新的生成器,从第一次产生而不是最后一次递归停止的地方。

def solve(something):
    if exit_condition(something):
        return

    next_to_try = stuff_to_try.next()
    while not if_works(next_to_try):
        next_to_try = stuff_to_try.next()
    solve(do_something(something))

当然我可以在递归函数中定义 stuff_to_try 但有更好的方法吗?是否有等效的 stuff_to_try.clone().reset() 或其他东西?

4

2 回答 2

3

在函数中定义生成器:

def stuff_to_try():
    return (i for i in [stuff, to, try])

然后每次你想要一个新的生成器时,只需调用该函数。

def solve(something):
    if exit_condition(something):
        return

    for next_to_try in stuff_to_try():
        if_works(next_to_try):
            break
    solve(do_something(something))

如果我正确阅读了您的问题,那么您真正想要的是:

def solve(something):
    if exit_condition(something):
        return

    for each in [stuff, to, try]:
        if_works(each):
            break
    solve(do_something(something))
于 2012-12-15T23:13:02.180 回答
1

最简单的答案是让它成为一个列表,然后它就会有你想要的行为:

stuff_to_try = [i for i in [stuff, to, try]]

一次又一次地重新计算值很可能会失去任何因懒惰而获得的效率收益。

于 2012-12-15T23:14:16.523 回答