python - 当未产生该值时,有没有办法更新生成器循环条件?

标签 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 吗?

我考虑过尝试另一个 yield ,以便我们实际上可以向 n 发送一个值,但我不太确定它如何与 next() 交互,而且我不一定想保留值 n。

最佳答案

生成器始终运行直到下一个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

关于python - 当未产生该值时,有没有办法更新生成器循环条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58582644/

相关文章:

python - 使用 PyInstaller 创建的桌面应用程序无法运行

python - 使用 Python 和 Google App Engine 的 Cookie

C# 通过 HTTP 发送图像

python - tqdm 显示生成器的进度我知道的长度

c - Raw Socket Linux 发送/接收数据包

c - C 中 send() 返回的数字是否包含空终止符?

javascript - 是否可以使用NODE.JS(或PYTHON)开发ACM ONLINE JUDGE系统?

python - 重复 B 列中的值,直到 python 中的 A 列发生变化

python - 有没有办法添加/修改使用yield创建的生成器的属性?

python - python 函数可以既是生成器又是 "non-generator"吗?