Python生成器在应该时不提供收益率

Python生成器在应该时不提供收益率,python,python-3.x,generator,yield,Python,Python 3.x,Generator,Yield,我有一个经过简化的脚本,它为我提供了一系列数字。 我已经在Windows10下运行了这个程序,同时使用了Python3.6和Python3.8 如果脚本使用注释掉的行:pal_gen.send10**digits运行,我得到了我期望的结果。但是我想在num%10=0时更改序列 剧本: def infinite_pal(): num = 0 while True: #print(f"num= {str(num)}") if num % 10 ==0: #if num

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

如果脚本使用注释掉的行:pal_gen.send10**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循环中的调用i。num值最多可达到30,并已生成。30不应该出现

我是否完全误解了。发送的效果 非常感谢。我可以用另一种方法来做,但我不明白为什么上面的方法不起作用

从前面的一个问题来看,我尝试过——但仍然没有给出我所期望的:

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

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

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

i = pal_gen.send(10*(digits-1))
但是它会给出无穷的20,所以如果您期望其他值,那么它将需要完全不同的代码


非常感谢上述评论。如果其他人不熟悉Python中的生成器,我将发表以下评论。第一个例子来自一个web站点2,事实上,据说它解释了Python生成器。我理解.send参数中存在错误,但我真正关心的是为什么第一种方法不起作用。我发表评论说:

当生成器中num的值为20时,收益率表达式似乎被调用,但值20从未发送到pal_gen循环中的调用i,即printi从未显示20

我知道生成器产生了20,因为当我在生成器中取消注释该行时:

#if num==20: print(f"Have num of {str(num)}")
展出了20件

当时我没有意识到。send也会得到生成的值,因此for循环中printi中的变量I只会每秒接收一次生成的值


第二个示例解决了此问题,尽管.send参数的计算不正确。

请使用正确的缩进发布代码。除非您询问缩进问题,否则缩进严重的Python代码不是一个函数。顺便说一句:您运行send10以发送到函数,但函数内部的num+=1,因此您可以检查11%10==0,但如果10%10==0,您可能会期望结果0、10、20、20谢谢您的帮助。我没有意识到发送接收和发送。而且,如果我使用next,它似乎会发送一个没有的消息。这是正确的吗?是的,发送并下一次运行生成器并获取生成的值
#if num==20: print(f"Have num of {str(num)}")