当不产生该值时,是否有一种方法可以更新生成器循环条件?

时间:2019-10-27 19:28:51

标签: python generator send yield

我正在尝试使用生成器创建一个计数器,但是,我还希望能够send()并更新生成器输入(尽管不一定要产生此输入)。

def numberGenerator(n):
 number = 0
 while number < n:
     yield number
     number += 1

我希望能够执行g = numberGenerator(5)-> next(g),0-> next(g),1-> g.send(10)以更新值n,以便生成器在输出4时不会停止,而是一直输出到9时。我该如何处理,同时仍将计数器保留在“数字”上?

当我输入g.send(10)时我也很困惑,因为它输出2。据我所知,我认为发送值正在发送到收益数字行,然后执行下面的代码。它不应该根据上面的代码返回11吗?

我已经考虑过尝试另一个收益,以便我们实际上可以将值发送给n,但是我不太确定该值将如何与next()交互,因此我不一定要保留值n。 / p>

1 个答案:

答案 0 :(得分:2)

生成器始终运行到下一个yield(或直到结束)-不管是由send还是next启动。

查看下面的修改后的代码。 newn是您发送给生成器的值。如果未指定,则为None。因此,您可以区分设置和获取值。

def numberGenerator(n):
    number = 0 
    while number < n:
        newn = yield number
        if newn is None:
            number += 1
        else:
            n = newn