Python生成器在应该时不提供收益率
我有一个经过简化的脚本,它为我提供了一系列数字。 我已经在Windows10下运行了这个程序,同时使用了Python3.6和Python3.8 如果脚本使用注释掉的行:pal_gen.send10**digits运行,我得到了我期望的结果。但是我想在num%10=0时更改序列 剧本: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
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)}")