如何获取生成器函数的多个实例

时间:2012-12-15 22:56:28

标签: python generator

  

可能重复:
  How to clone a Python generator object?

假设我有一个生成器'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()或其他东西?

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

最简单的答案是将其列为一个列表,然后它将具有您想要的行为:

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

通过一次又一次地重新计算这些值,可能会失去因懒惰而带来的任何效率提升。