繁体   English   中英

python生成器yield语句不yield

[英]python generator yield statement not yield

这是我正在运行的代码:

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) 

我期待看到如下结果:

it is 3
it is 33
it is 333
it is 3333

然而,我真正得到的是:

it is 3
it is 36
it is 366
it is 3666

我认为这可能与在主代码中使用send有关,但无法弄清楚原因。 谁能帮忙?

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

  • 首先,我们发送一个None来启动生成器并接收第一个值
  • 之后,我们发送一个值并接收下一个值
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

我设法通过向infinite_Third()添加额外的收益使其按您预期的方式工作,但坦率地说,我不知道它为什么会起作用。

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看起来像是在消耗它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM