Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python生成器混淆行为_Python_Generator_Send_Coroutine - Fatal编程技术网

Python生成器混淆行为

Python生成器混淆行为,python,generator,send,coroutine,Python,Generator,Send,Coroutine,当我阅读发电机教程时,会出现这个问题是回文(101)返回True,但代码没有打印101。我调试并看到yield 101将执行返回到主for循环,该循环立即返回到生成器,这非常混乱。生成器产生101,因此它应该是pal\u gen:中j的元素,不是吗 def is_palindrome(num): # Skip single-digit inputs if num // 10 == 0: return False temp = num reverse

当我阅读发电机教程时,会出现这个问题<代码>是回文(101)返回True,但代码没有打印101。我调试并看到
yield 101
将执行返回到主
for
循环,该循环立即返回到生成器,这非常混乱。生成器产生101,因此它应该是pal\u gen:中j的
元素,不是吗

def is_palindrome(num):
    # Skip single-digit inputs
    if num // 10 == 0:
        return False
    temp = num
    reversed_num = 0

    while temp != 0:
        reversed_num = (reversed_num * 10) + (temp % 10)
        temp = temp // 10

    if num == reversed_num:
        return True
    else:
        return False

def infinite_palindromes():
    num = 0
    while True:
        if is_palindrome(num):
            i = (yield num)
            if i is not None:
                num = i
        num += 1

if __name__=='__main__':        
    pal_gen = infinite_palindromes()
    for j in pal_gen:
        print(f'j={j}')
        digits = len(str(j))
        if digits == 5:
            pal_gen.close()        
        pal_gen.send(10 ** (digits))
目前的输出是:

j=11
j=111
j=1111
j=10101
Traceback (most recent call last):
  File "generator.py", line 33, in <module>
    pal_gen.send(10 ** (digits))
StopIteration
j=11
j=111
j=1111
j=10101
回溯(最近一次呼叫最后一次):
文件“generator.py”,第33行,在
pal_gen.send(10**(数字))
停止迭代

您会注意到,它在两个选项之间跳过了一个选项。101不见了,1001不见了。10001不见了。我很确定
send
会引导生成器运行到下一个收益率语句。例如,使用以下代码:

如果名称=main:
pal_gen=无限回文()
对于pal_gen中的j:
打印('j={}'。格式(j))
数字=len(str(j))
如果数字==5:
pal_gen.close()
打印(制式发送(10**(数字)))
这将打印出“j”之间缺少的值:

考虑使用
while
重新执行
for
语句:

如果名称=main:
pal_gen=无限回文()
j=下一个(pal\U gen)
数字=0
而数字谢谢。还说send()也使用一个值,如果不使用参数,send()实际上等同于next()。
j=11
101
j=111
1001
j=1111
10001
j=10101