【问题标题】:How to get multiple instances of a generator function [duplicate]如何获取生成器函数的多个实例[重复]
【发布时间】:2012-12-03 12:47:38
【问题描述】:

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

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

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() 之类的东西?

【问题讨论】:

    标签: python generator


    【解决方案1】:

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

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

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

    【讨论】:

    • 哎呀,问题中的坏例子。该列表会更容易,因为我暗示要生成一个简短的有限列表,但真正的问题是如何克隆生成器,所以假设生成器更复杂
    • 绝对是最简单的,但有时并不实用。列表可能不适合内存。
    • 当然,这是缺点。也就是说,这可能是唯一可行的解​​决方案,具体取决于手头的发电机。
    • 为什么不stuff_to_try = (i for i in [stuff, to, try])
    【解决方案2】:

    在函数中定义生成器:

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

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多