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

问题描述 投票:1回答:2

我正在尝试使用生成器创建计数器,但是,我也希望能够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。在保持计数器在'number'的状态下,我将如何处理?

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

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

python generator send yield
2个回答
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

0
投票

将生成器定义为实现send方法以更新限制的类:

class NumberGenerator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0

    def __next__(self):
        if self.current >= self.limit:
            raise StopIteration

        current = self.current
        self.current += 1

        return current

    def next(self):
        return self.__next__()

    def send(self, new_limit):
        self.limit = new_limit


g = NumberGenerator(5)
next(g)  # 0
next(g)  # 1
g.send(10)
next(g)  # 2
next(g)  # 3
next(g)  # 4
next(g)  # 5
next(g)  # 6
next(g)  # 7
next(g)  # 8
next(g)  # 9

[请注意,只有在使用Python 2时才需要next方法,因为该方法已在Python 3中重命名为__next__

© www.soinside.com 2019 - 2024. All rights reserved.