首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python生成器yield语句not yield

python生成器yield语句not yield
EN

Stack Overflow用户
提问于 2019-12-14 01:55:12
回答 2查看 261关注 0票数 5

下面是我正在运行的代码:

代码语言:javascript
复制
def infinite_Third() -> Generator:
    num = 1
    while True:
        if num % 3 ==0:
            i = (yield num)
            if i is not None:
                num = i
        num += 1 

if __name__=='__main__':
    third_gen = infinite_Third()
    for i in third_gen:
        print(f"it is {i}")          
        if i>1000:
            break    
        third_gen.send(10*i+1) 

我期望看到如下结果:

代码语言:javascript
复制
it is 3
it is 33
it is 333
it is 3333

然而,我真正得到的是:

代码语言:javascript
复制
it is 3
it is 36
it is 366
it is 3666

我认为这可能与在主代码中使用send有关,但不知道为什么。有人能帮上忙吗?

EN

回答 2

Stack Overflow用户

发布于 2019-12-14 02:13:37

根据我的评论,我已经修改了你的主循环

  • 首先,我们发送一个None来启动生成器并接收第一个值
  • 之后,我们发送一个值并接收下一个

代码语言:javascript
复制
if __name__ == '__main__':
    third_gen = infinite_Third()
    i = third_gen.send(None)
    while True:
        print(f"it is {i}")
        i = third_gen.send(10*i+1)
        if i > 1000:
            break
票数 1
EN

Stack Overflow用户

发布于 2019-12-14 02:33:20

通过向infinite_Third()添加额外的收益,我成功地让它像您期望的那样工作,但坦率地说,我不知道为什么它会工作。

代码语言:javascript
复制
def infinite_Third() -> Generator:
    num = 1
    while True:
        if num % 3 ==0:
            i = yield num
            if i is not None:
                num = i
            yield
        num += 1

似乎,每次调用send()时,都会将一个额外的None值放入生成器缓冲区,而额外的yield看起来就像是在消耗它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59327603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档