首页 > 解决方案 > Python生成器在应该提供的时候没有提供yield

问题描述

我有一个经过简化的脚本,可以为我提供一系列数字。我已经在 Windows 10 下运行了这个,同时使用 Python3.6 和 Python3.8

如果脚本与以下行一起运行: pal_gen.send(10 ** (digits)) 注释掉了,我得到了我的预期。但是我想在 num % 10 = 0 时更改序列。

剧本:

def infinite_pal():
num = 0
while True:
    #print(f"num= {str(num)}")
    if num % 10 ==0:
        #if num==20: print(f"Have num of {str(num)}")
        i = (yield num)
        #if num==20: print(i)
        if i is not None:
            num = i
            #print(f"i = {str(i)}   num= {str(num)}")
    num += 1
    if num==112: break

pal_gen = infinite_pal()
for i in pal_gen:
    print(i)
    digits = len(str(i))
    #print(f"result = {str(10 ** (digits))}")
    pal_gen.send(10 ** (digits))

给出 0, 30

我本来预计:0、10、20、20、20 等。

当 num 的值为 20 时,yield 表达式似乎被调用,但值 20 从未发送到 pal_gen 循环中的 for i 调用。num 值确实达到 30 并产生。30 不应出现。

我是否完全误解了 .send 的效果 非常感谢。我可以用另一种方式做到这一点,但我很困惑为什么上述方法不起作用。

从一个较早的问题,python 生成器 yield 语句不是 yield,我尝试了 - 但它仍然没有给出我所期望的:

def infinite_pal():
    num = 0
    while True:
    if num % 10 ==0:
        #if num==20: print(f"Have num of {str(num)}")
        i = (yield num)
        #if num==20: print(i)
        if i is not None:
            num = i
            #print(f"i = {str(i)}   num= {str(num)}")
    num += 1

pal_gen = infinite_pal()
i = pal_gen.send(None)
while True:
    print(i)
    digits = len(str(i))
    #print(f"result = {str(10 ** (digits))}")
    i=pal_gen.send(10 ** (digits))
    if i>200: break

标签: pythonpython-3.xgeneratoryield

解决方案


0, 10, 20, 20, 20如果您发送10, 100, 1000,我不知道您为什么期望结果10000

在第二个版本中,您必须发送

i = pal_gen.send(10*(digits-1))

但它会提供无穷无尽的20,所以如果你期望其他值,那么它将需要完全不同的代码。


def infinite_pal():
    num = 0
    while True:
        if num % 10 ==0:
            i = yield num
            if i is not None:
                num = i
        num += 1

pal_gen = infinite_pal()
i = pal_gen.send(None)
while True:
    print(i)
    digits = len(str(i))
    i = pal_gen.send(10*(digits-1))
    ## `i` never will be bigger then `20` so next lines are useless
    #if i > 200:
    #    break

推荐阅读